Laravel / Eloquent:在多态表中按值搜索行

时间:2014-01-29 09:21:16

标签: laravel eloquent relation polymorphism

我现在陷入困境,希望有人能帮助我。我正在使用多态关系,并希望在我的数据库中搜索满足“父”表和“子”表中条件的行。

要得到具体的一个小例子。鉴于以下结构,例如,想要寻找价格“600”和房间“3”的房产。有没有办法用雄辩的方式做到这一点?



表格属性(父级)

  • id
  • details_type [可以是“公寓”或“包裹”]
  • details_id

表公寓(儿童)

  • ID

表格宗地(子)

  • ID
  • ...(没有“房间”栏)



关系

类属性

public function details() {
  return $this->morphTo();
}

Classes Apartment + Parcel

public function property() {
  return $this->morphMany('Property', 'details')
}




我尝试了什么

很多,真的。但不知何故,我总是做错事或遗失某些事情。在我看来应该有效的解决方案是:

Property::with(array('details' => function($query) {
                  $query->where('rooms', 3);
             }));

Property::with('details')
        ->whereHas('details', function($query) {
            $query->where('rooms', '=', '3');
        });

但是在这两种情况下我都得到以下FatalError。:

Class name must be a valid object or a string



你们有没有人遇到过类似的问题?非常感谢您的任何暗示。

1 个答案:

答案 0 :(得分:3)

让我们从您的命名约定开始:

public function detail() // It relates to a single object
{
    return $this->morphTo();
}

public function properties() // It relates to several objects
{
    return $this->morphMany('Property', 'details')
}

然后你就可以做到这一点:

$properties = Property::whereHas('details', function($q)
{
    $q->where('rooms', '=', '3');
})
->where('price', '=', 600)
->get();

请注意,由于没有包含房间的包裹,因此永远不会退回包裹。