Laravel Eager загрузка с условием вложенного ИЛИ

$query = LeadsModel::with(
                            array(
                                    'emails' => function ($q) use ($inputs) 
                                    {
                                        $q->orwhere('email','like',"%john%");
                                        $q->orwhere('email','like',"%mark%");
                                    }
                                )
                            )
                            ->whereHas
                            (
                                'emails', function ($q) use ($inputs) 
                                {
                                    $q->orwhere('email','like',"%john%");
                                    $q->orwhere('email','like','%mark%');
                                }
                            );

    $res = $query->get();

    display_output($res);
    return;

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

дополнительный вопрос:

  • Как я могу добавить несколько условий ИЛИ во вложенное условие при нетерпеливой загрузке?
  • как я могу контролировать приоритет условия? скажем, у меня будет 2 или 3 условия с одинаковым приоритетом, и у меня будет еще одно условие с условием AND во вложенном условии нетерпеливой загрузки

обновлено

Это по-прежнему записывает все данные без применения каких-либо условий.

    $query = LeadsModel::with(
                            array(
                                    'emails' => function ($q) use ($inputs) 
                                    {
                                        $q->orWhere('email','like',"%john%");
                                        $q->orWhere('email','like',"%james%");
                                    }
                                )
                            )
                            ->whereHas
                            (
                                'emails', function ($q) use ($inputs) 
                                {
                                    $q->where('email','like',"%john%")->orWhere('email','like','%james%');
                                }
                            );

    $res = $query->get();

    display_output($res);
    return;

в обычном sql, я думаю, это было бы

выберите Leads.,lead_detail_emails. from Leads, lead_detail_emails, где lead.id = lead_detail_emails.lead_id и (lead_detail_emails.email, например, «%john%» ИЛИ lead_detail_emails.email, например, «%james%»);


person rfpdl    schedule 29.10.2014    source источник
comment
Вы должны добавить пример/код, которого вы хотите достичь   -  person Marcin Nabiałek    schedule 29.10.2014
comment
Я обновил свой вопрос. Спасибо   -  person rfpdl    schedule 29.10.2014
comment
Пожалуйста, объясните, какие именно записи вы хотите получить из базы данных - теперь, похоже, вы хотите получить записи моделей потенциальных клиентов, которые содержат электронные письма, такие как john или james, и получить для них электронные письма связанных моделей, которые также имеют только имя john или james.   -  person Marcin Nabiałek    schedule 29.10.2014
comment
я хотел бы получить записи от руководства (родителя таблицы электронной почты) с условием поиска электронной почты Джона или Джеймса   -  person rfpdl    schedule 29.10.2014
comment
@Ponce Ваше предположение о запросе неверно, проверьте мой отредактированный ответ для деталей.   -  person Jarek Tkaczyk    schedule 29.10.2014


Ответы (1)


Вам нужно вложить где:

whereHas('emails', function ($q)
{
    $q->where(function ($q) {
      $q->where('email','like',"%john%")
        ->orWhere('email','like','%mark%');
    });
})

Это пример запроса для whereHas со сводной таблицей (belongsToMany):

select * from `table` 
    where `table`.`deleted_at` is null 
        and (select count(*) from `related_table` inner join `pivot_table` on `related_table`.`id` = `pivot_table`.`related_id` 
    where `pivot_table`.`user_id` = `table`.`id` 
        and (`some_field` like ? or `some_field` like ?)) >= 1
person Jarek Tkaczyk    schedule 29.10.2014
comment
этот код возвращает всю запись без применения условий. я обновил вопрос с полной нетерпеливой загрузкой. - person rfpdl; 29.10.2014
comment
извините за мою ошибку с комментарием выше. это возвращает только запись Джона. - person rfpdl; 29.10.2014
comment
@Ponce Вы говорите, что он будет игнорировать 2-е место, что неверно. Так что проверьте свое ожидание и реальный результат. Это то, что вам нужно. - person Jarek Tkaczyk; 29.10.2014
comment
Мне нужен Джон или Джеймс, что касается результата. Я добавил запрос sql, возможно, что-то в этом роде. - person rfpdl; 29.10.2014
comment
Я знаю по коду, который у вас есть, но знаете ли вы наверняка? Вы проверили выполняемый запрос и сравнили его результат с тем же запросом, запущенным в БД, за пределами фреймворка, поэтому вы говорите, что он что-либо игнорирует? Это возвращает только XYZ может быть правдой, потому что нет других возвращаемых строк, в то время как запрос в порядке. - person Jarek Tkaczyk; 29.10.2014
comment
Спасибо, Ярек, у меня все это время была "метка". теперь он работает нормально. Извини за это - person rfpdl; 29.10.2014