Laravel 5 SQLSTATE [42S22]:找不到列:1054 '字段列表'中的未知列'user_id'

Posted

技术标签:

【中文标题】Laravel 5 SQLSTATE [42S22]:找不到列:1054 \'字段列表\'中的未知列\'user_id\'【英文标题】:Laravel 5 SQLSTATE[42S22]: Column not found: 1054 Unknown column 'user_id' in 'field list'Laravel 5 SQLSTATE [42S22]:找不到列:1054 '字段列表'中的未知列'user_id' 【发布时间】:2015-04-20 06:56:34 【问题描述】:

当我尝试创建以用户身份登录的新项目时遇到问题。 我的旧表“项目”有一个名为 user_id 的列,我决定删除它,因为 laravel 5 会自动执行它。因此,我使用正确的项目表(没有“user_id”列)刷新迁移,但是当我尝试创建新项目时,出现此错误:

QueryException in Connection.php line 614:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'user_id' in 'field list' (SQL: insert into `projects` (`name`, `slug`, `user_id`, `updated_at`, `created_at`) values (Project 1, project-1, 1, 2015-02-18 23:36:28, 2015-02-18 23:36:28))

这真的很奇怪,因为我在任何与“项目”相关的文件中都没有找到“用户 ID”。我检查了工作台,桌子没问题。这是我用来存储项目的函数:

    public function store(Request $request)
    
        Auth::user()->projects()->create($request->all());

        return Redirect::route('projects.index')->with('message', 'Project created!');
    

似乎 laravel 存储了我的旧“项目”表,并且在我这样做时没有刷新。我已经将作曲家更新为转储自动加载,但错误仍然存​​在。这是迁移文件上创建表的部分:

    Schema::create('projects', function(Blueprint $table)
    
        $table->increments('id');
        $table->string('name');
        $table->string('slug');
        $table->timestamps();
    );

没有“user_id”列。这是我的项目模型:

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class Project extends Model 
    protected $table = 'projects';

    protected $guarded = [];

    public function tasks()
    
        return $this->hasMany('App\Task');
    
    public function users()
    
        return $this->belongsTo('App\User');
    

任务模型是相同的,除了关系部分。而我使用的用户模型是默认的,只添加了关系。

感谢任何相关的帮助。

【问题讨论】:

我手动删除了所有表并再次运行迁移,它工作了!我现在收到其他错误Call to a member function projects() on a non-object 至少查询错误已完成。谢谢!! 插入是在这个命令中自动完成的,如上所示:Auth::user()-&gt;projects()-&gt;create($request-&gt;all()); 我检查了 $request 变量,它具有正确的值,问题是它何时会保存在数据库中。跨度> 【参考方案1】:

这里的问题是您应该为您的项目表设置user_id 列。 Laravel 不会自动改变你的数据库架构

当你运行时:

Auth::user()->projects()->create($request->all());

Laravel 尝试做这样的事情:

Project::create(array_merge($request->all(), 'user_id' => Auth::user()->id));

所以 Laravel 会尝试将新创建的项目分配给你给他的用户(在本例中为 Auth::user())。因此,在这种情况下,您需要拥有 user_id 列,因为您甚至定义了关系:

public function users()

    return $this->belongsTo('App\User');

因此,将项目绑定到用户的默认列将是 user_id,并且在您的架构中需要它才能工作。

【讨论】:

以上是关于Laravel 5 SQLSTATE [42S22]:找不到列:1054 '字段列表'中的未知列'user_id'的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.8:SQLSTATE [42S22]:找不到列:1054 未知列

Laravel 5 SQLSTATE [42S22]:找不到列:1054 '字段列表'中的未知列'user_id'

SQLSTATE [42S22]:找不到列:1054 未知列 - Laravel

Laravel 删除数据 - SQLSTATE [42S22]:找不到列:1054 未知列

SQLSTATE [42S22]:找不到列:在 laravel livewire 项目中

SQLSTATE [42S22]:未找到列:1054 未知列一对多(反向)关系 laravel