我对 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
});
文章 Controller :
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)
最佳答案
您缺少 foreign key
在你的suppliers
表,因此将其添加到 suppliers
的迁移中
$table->integer('article_id');
由于您使用了 hasOne('Supplier')
在你的Article
然后模型 Laravel
将在suppliers
中寻找相关型号使用 article_id
的表格这将与父表(文章)中的模型相关,使用 id
.换句话说,记录在你的articles
表将与 suppliers
建立关系使用这样的东西:
表格articles
(家长):
id | ...
1 | ...
2 | ...
表格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
table primary Key/id
指foreign key/article_id
在suppliers
表。
换句话说,您有 suppliers
的引用在articles
使用 article_id
的表格所以你应该在你的suppliers
中使用表:
public function article() {
return $this->hasMany('Article');
}
然后在相反的模型(文章)中使用反向关系(belongsTo
)使用:
// In Article Model
public function supplier() {
return $this->belongsTo('Supplier');
}
关于mysql - Eloquent ORM 错误 : Column not found: 1054,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22676642/