【发布时间】:2014-06-26 22:40:45
【问题描述】:
我对 Eloquent(以及整个 ORM 确实)相当陌生。我已经阅读了很多背景资料,但无法完全理解 Eloquent 中的关系。
我有一个与颜色模型、制造模型和模型模型相关的汽车模型。
我将 Car::getAll() 作为 $cars 传递给我的视图。当我调用 dd(toArray($cars)) 时,我得到以下信息:
array (size=1)
0 =>
array (size=12)
'id' => string '1' (length=1)
'registration' => string '123' (length=3)
'make' =>
array (size=5)
'id' => string '1' (length=1)
'title' => string 'Ford' (length=4)
'slug' => string 'ford' (length=4)
'created_at' => string '2014-06-26 21:30:23' (length=19)
'updated_at' => string '2014-06-26 21:30:23' (length=19)
'model' =>
array (size=5)
'id' => string '1' (length=1)
'title' => string 'Mustang' (length=7)
'slug' => string 'mustang' (length=7)
'created_at' => string '2014-06-26 21:30:41' (length=19)
'updated_at' => string '2014-06-26 21:30:41' (length=19)
'color' =>
array (size=5)
'id' => string '1' (length=1)
'title' => string 'Red' (length=3)
'slug' => string 'red' (length=3)
'created_at' => string '2014-06-26 21:30:03' (length=19)
'updated_at' => string '2014-06-26 21:30:03' (length=19)
'year' => string '1991' (length=4)
'is_classic' => string '1' (length=1)
'price' => string '999.00' (length=6)
'sold' => string '0' (length=1)
'active' => string '1' (length=1)
'created_at' => string '2014-06-26 22:17:27' (length=19)
'updated_at' => string '2014-06-26 22:17:27' (length=19)`
这对我来说似乎是正确的,但是当我有的时候:
foreach ($cars as $car) {
echo $car->color-title;
}
我收到“尝试获取非对象的属性”错误。
我的模型如下:
Car.php
class Car extends \Eloquent {
protected $fillable = ['color_id'];
public function color() {
return $this->belongsTo('Color', 'id');
}
public function model() {
return $this->belongsTo('Model', 'id');
}
public function make() {
return $this->belongsTo('Make', 'id');
}
public static function getAll() {
return Car::with('color', 'make', 'model')->where('active', 1)->get();
}
}
Color.php
class Color extends \Eloquent {
protected $fillable = ['title', 'slug'];
public function cars() {
return $this->hasMany('Car', 'color');
}
}
Make.php
class Make extends \Eloquent {
protected $fillable = [];
public function cars() {
return $this->hasMany('Car', 'make');
}
}
Model.php
class Model extends \Eloquent {
protected $fillable = [];
public function cars() {
return $this->hasMany('Car', 'model');
}
}
任何帮助将不胜感激。谢谢
编辑:
抱歉,我应该包含我的架构升级方法:
创建MakesTable
public function up()
{
Schema::create('makes', function(Blueprint $table)
{
$table->increments('id');
$table->string('title');
$table->string('slug');
$table->timestamps();
});
}
创建模型表
public function up()
{
Schema::create('models', function(Blueprint $table)
{
$table->increments('id');
$table->integer('make')->unsigned();
$table->string('title');
$table->string('slug');
$table->timestamps();
});
Schema::table('models', function(Blueprint $table)
{
$table->foreign('make')->references('id')->on('makes')->onDelete('cascade');
});
}
创建颜色表
public function up()
{
Schema::create('colors', function(Blueprint $table)
{
$table->increments('id');
$table->string('title');
$table->string('slug');
$table->timestamps();
});
}
创建汽车表
public function up()
{
Schema::create('cars', function(Blueprint $table)
{
$table->increments('id');
$table->string('registration');
$table->integer('make')->unsigned();
$table->integer('model')->unsigned();
$table->integer('year');
$table->integer('color')->unsigned();
$table->boolean('is_classic');
$table->float('price');
$table->boolean('sold');
$table->boolean('active');
$table->timestamps();
});
Schema::table('cars', function(Blueprint $table)
{
$table->foreign('make')->references('id')->on('makes')->onDelete('cascade');
$table->foreign('model')->references('id')->on('models')->onDelete('cascade');
$table->foreign('color')->references('id')->on('colors')->onDelete('cascade');
});
}
【问题讨论】:
-
外键在哪里?那些关系定义是错误的,这是肯定的。
-
你永远不应该假设循环中存在关系。您可能有一辆没有相关颜色模型的汽车被退回。先检查,然后做任何你需要做的事情。
-
@deczo 我已经添加了我的 Schema up 方法来显示外键的位置。
-
@JasonLewis 对不起,你能指出如何检查这个的方向吗?我假设能够将它作为这样的数组返回,这表明我拥有预期的对象 - 尽管显然它没有:/