雄辩ORM错误:未找到列:1054



我有一个问题与hasOne关系,但我不明白为什么。一篇文章只是一个供应商。因此,在Article模型中放置一个指向主键供应商的外键。

class Article extends Eloquent {
    public $timestamps = true;
    protected $softDelete = true;
    // Accesibles to edit
    //protected $fillable = array( 'code', 'name', 'size', 'price', 'redial', 'supplier_id', 'count', 'description', 'colour' );
    protected $fillable = array('*');
    // prevent edit
    protected $guarded = array( 'updated_at', 'created_at', 'id' );

    public function supplier() {
        return $this->hasOne('Supplier');
    }
}

class Supplier extends Eloquent {
    public $timestamps = true;
    protected $softDelete = true;
    protected $fillable = array('*');
    protected $guarded = array('id', 'created_at', 'updated_at');

    public function article() {
        return $this->belongsTo('Article');
    }
}

迁移:

Schema::create('articles', function($table)
        {
            // DB Engine
            $table->engine = 'InnoDB';
            // Columns
            $table->increments('id');
            $table->string('code')->unique();
            $table->string('name', 100);
            $table->text('description')->nullable();
            $table->string('colour')->nullable();
            $table->integer('count')->unsigned();
            $table->float('price')->unsigned();
            $table->float('redial')->default(100)->unsigned();
            $table->integer('supplier_id')->unsigned();
            $table->foreign('supplier_id')->references('id')->on('suppliers');
            // Additionals columns
            $table->softDeletes(); // Never removed, only sets a date of deletion in delete_at column
            $table->timestamps();    // Set created_at updated_at columns automatically
            // Index and others atributtes
            $table->index('code');
        });

Schema::create('suppliers', function($table)
        {
            // DB Engine
            $table->engine = 'InnoDB';
            // Columns
            $table->increments('id');
            $table->string('full_name', 50);
            $table->string('company', 50);
            // Additionals columns
            $table->softDeletes(); // Never removed, only sets a date of deletion in delete_at column
            $table->timestamps();    // Set created_at updated_at columns automatically
        });

文章控制器:

public function create()
    {
        $article = new Article;
        $article->code = Input::get('code');
        $article->name = Input::get('name');
        $article->description = Input::get('description');
        $article->size = Input::get('size');
        $article->colour = Input::get('colour');
        $article->count = Input::get('count');
        $article->price = Input::get('price');
        $article->redial = Input::get('redial');
        $supplier = Supplier::find(Input::get('supplier_id'));
        $article->supplier->associate($supplier);
        $article->save();
        return View::make('articles.show')->with( array('article' => $article) );
    }
输出:

Illuminate  Database  QueryException
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'suppliers.supplier_id' in 'where clause' (SQL: select * from `suppliers` where `suppliers`.`deleted_at` is null and `suppliers`.`supplier_id` is null limit 1)

您的suppliers表中缺少foreign key,因此将其添加到suppliers的迁移中

$table->integer('article_id');

由于您在Article模型中使用了hasOne('Supplier'),那么Laravel将使用article_idsuppliers表中查找相关模型,该模型将使用id与父表(文章)中的模型相关。换句话说,articles表中的记录将使用如下方式与suppliers建立关系:

Table articles (Parent):
id | ...
 1 | ...
 2 | ...
Table suplierss (Child):
id | article_id | ... 
 1 |     1      | ... //<-- article_id in this table is id in articles table
 2 |     2      | ... //<-- article_id in this table is id in articles table

articles表中primary Key/idsuppliers表中的foreign key/article_id

换句话说,你在articles表中使用article_id引用suppliers,所以你应该在suppliers表中使用:

public function article() {
    return $this->hasMany('Article');
}

然后在相反的模型(Article)中使用反向关系(belongsTo):

// In Article Model
public function supplier() {
    return $this->belongsTo('Supplier');
}

您的where子句正在寻找suppliers.supplier_id -但在您的CREATE模式中,这没有指定。

Schema::create('suppliers', function($table)
        {
            // DB Engine
            $table->engine = 'InnoDB';
            // Columns
            $table->increments('id');
            $table->integer('supplier_id');  // consider adding an integer for supplier id.
            $table->string('full_name', 50);
            $table->string('company', 50);
            // Additionals columns
            $table->softDeletes(); // Never removed, only sets a date of deletion in delete_at column
            $table->timestamps();    // Set created_at updated_at columns automatically
        });

最新更新