【问题标题】:Troubles with EloquentEloquent 的问题
【发布时间】: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 对不起,你能指出如何检查这个的方向吗?我假设能够将它作为这样的数组返回,这表明我拥有预期的对象 - 尽管显然它没有:/

标签: laravel-4 eloquent


【解决方案1】:

就像 Jason 指出的错误是由其中一个关系返回的 null 引起的。但是你的设置的问题是,关系定义是错误的。

所以首先让它们正确:

// it goes like this:
// belongsTo('Model', 'foreign_key_on_this_model', 'primary_key_on_related')

public function color() {
    return $this->belongsTo('Color', 'color'); // primary key is id so no need to specify
}

hasMany 其他模型上的关系还可以。

然后在那个循环中:

foreach ($cars as $car)
{
   if (count($car->color))
   {
       // do something with color
   }
}

由于我使用 count 的原因,请阅读:Laravel check if related model exists

您也可以只退回具有相关颜色、品牌和任何您需要的汽车,如下所示:

$cars = Car::has('color')->has('make')...

【讨论】:

    猜你喜欢
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 2015-06-27
    • 2015-02-23
    • 1970-01-01
    • 2019-04-20
    相关资源
    最近更新 更多