【问题标题】:Laravel 5 - Eloquent JOIN confusionLaravel 5 - Eloquent JOIN 混淆
【发布时间】:2015-07-20 15:18:24
【问题描述】:

我有两个简单的表格,猫和品种:

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 是一个FK,指向breeds 表的PK。我书中的示例代码应该返回包含特定品种的所有猫的视图,但没有返回结果:

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

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

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

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

编辑:

我可以让它与以下 hacky 代码一起工作,它首先通过查询 name 字段从品种表中获取 id,然后使用该 id 查询 cat 表:

$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');
    }

}

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

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

    假设你的模型关系是有序的,你可以这样做,例如

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

    另外,我的缅甸猫刚刚撞到了显示器;我认为她对自己不在品种列表中感到不安。

    【讨论】:

    • 您的解决方案产生了 sql 错误。如果你想看,我可以分享。它基本上是用一个只存在于猫中的字段来查询品种表,breed_id。
    • fyi 它是“SQLSTATE[42S22]:找不到列:1054 'where 子句'中的未知列'breeds.breed_id'(SQL:从breeds 中选择* breeds.breed_id = 1 和breeds.breed_id 不为空)"
    • 那么我假设您没有在模型中建立品种和猫之间的关系?我的意思是,我基本上在做和你编辑一样的事情。
    • 我更新了我原来的帖子。仅供参考,除了我的小技巧之外,所有代码都直接来自“laravel 5 essentials”一书(一本新书,错误数量惊人)。
    • 很好,相关的代码总是让事情变得更容易。看起来这两个模型都指的是Furbook\Breedcats() 函数中的那个应该是Furbook\Cat。这也解释了您在上面遇到的 SQL 错误 - Laravel 正在尝试在您的品种表中搜索猫。
    猜你喜欢
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    相关资源
    最近更新 更多