我有一个问题与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_id
在suppliers
表中查找相关模型,该模型将使用id
与父表(文章)中的模型相关。换句话说,articles
表中的记录将使用如下方式与suppliers
建立关系:
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/id
指suppliers
表中的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
});