Laravel/Eloquent: поиск строк по значению в полиморфной таблице

Я застрял в данный момент и надеюсь, что кто-то может дать мне руку. Я использую полиморфное отношение и хочу найти в моей базе данных строки, которые удовлетворяют условиям в родительской и дочерней таблицах.

Чтобы получить конкретные, один небольшой пример. Учитывая следующую структуру, я, например. хотите найти недвижимость с ценой 600 и номерами 3. Есть ли способ сделать это с красноречивым?



Столы

Свойства таблицы (родительская)

  • id
  • цена
  • details_type [может быть Квартира или Участок]
  • details_id

Апартаменты-таблицы (дочерние)

  • id
  • номера

Участки стола (дочерние)

  • id
  • ... (нет столбца "комнаты")



Отношения

Свойство класса

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

Классы Квартира + Участок

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




Что я пробовал

Много, правда. Но почему-то я всегда что-то делаю не так или что-то упускаю. Решения, которые, на мой взгляд, должны работать:

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

or

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

Но в обоих случаях я получаю следующее FatalError.:

Class name must be a valid object or a string



У кого-нибудь из вас уже была подобная проблема? Большое спасибо за любую подсказку.


person MrSnoozles    schedule 29.01.2014    source источник


Ответы (1)


Давайте начнем с вашего соглашения об именах:

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();

Обратите внимание, что это никогда не вернет Посылку, так как нет посылки с комнатой.

person Ronald Hulshof    schedule 03.02.2014
comment
Большое спасибо за ваш ответ. Ваше предложенное решение - это то, о чем я тоже подумал. Однако при этом я получаю сообщение об ошибке: Symfony\Component\Debug\Exception\FatalErrorException Class name must be a valid object or a string. Мне кажется, что whereHas еще не поддерживает полиморфные отношения. - person MrSnoozles; 07.02.2014
comment
О, теперь я понимаю, в чем проблема. Eloquent пока не поддерживает Eager Loading of Polymorphic Childs. Eloquent может загружать только полиморфных родителей. Я бы посоветовал вам вместо этого использовать Query Builder и сделать это необработанным способом. :) - person Ronald Hulshof; 14.02.2014