Laravel 5 - Eloquent加入混乱

时间:2015-05-09 21:42:13

标签: laravel eloquent

我有两个简单的桌子,猫和品种:

mysql> select * from cats;
+----+--------+---------------+----------+---------------------+---------------------+
| id | name   | date_of_birth | breed_id | created_at          | updated_at          |
+----+--------+---------------+----------+---------------------+---------------------+
|  1 | Rita   | 2008-07-06    |        1 | 2015-05-09 20:40:49 | 2015-05-09 20:50:20 |
|  2 | Muni   | 1992-05-15    |        3 | 2015-05-09 20:50:54 | 2015-05-09 20:50:54 |
|  3 | Hector | 2005-01-23    |        4 | 2015-05-09 21:08:23 | 2015-05-09 21:08:23 |
+----+--------+---------------+----------+---------------------+---------------------+
3 rows in set (0.00 sec)

mysql> select * from breeds;
+----+------------+
| id | name       |
+----+------------+
|  1 | Domestic   |
|  2 | Persian    |
|  3 | Siamese    |
|  4 | Abyssinian |
+----+------------+
4 rows in set (0.00 sec)

我想做的就是得到一个特定品种的猫的清单。在cats表中,breed_id是一个指向品种表PK的FK。我书中的示例代码应该返回一个特定品种的所有猫的视图,但不会返回结果:

我正在尝试的网址是/ cats / braeds / Domestic

生成的视图在routes.php文件中使用此逻辑:

Route::get('cats/breeds/{name}', function($name)
{
    $cats = Furbook\Cat::with('breeds')
        ->whereName($name)
        ->get();
dd($cats);
});

当我dd($ cats)时我得到零结果,即使我有一只国内品种为1的猫。我在这里做错了什么?

编辑:

我可以使用以下hacky代码,它首先通过查询name字段从breeds表中获取id,然后使用该id查询cats表:

$breed = Furbook\Breed::whereName($name)->get();
$id = $breed[0]['attributes']['id'];
$cats = Furbook\Cat::whereId($id)->get();

如何将其整合为一个Eloquent查询?我在Laravel网站上看不到这种查询的例子。

有关模型的详细信息,请参阅:

class Breed extends Model {

    public $timestamps = false;

    public function cats()
    {
        return $this->hasMany('Furbook\Breed');
    }

}

class Cat extends Model {

    protected $fillable = [
        'name',
        'date_of_birth',
        'breed_id',
    ];

    public function breed()
    {
        return $this->belongsTo('Furbook\Breed');
    }

}

1 个答案:

答案 0 :(得分:2)

您要求系统为您提供名称为Domestic的所有猫 - 并非所有品种名为Domestic的猫。

假设您的模型关系正常,您可以这样做。

$cats = Furbook\Breed::whereName($name)->first()->cats;

另外,我的缅甸猫刚刚击中显示器;我觉得她很不高兴她不在品种名单中。