2015-07-02 4 views
2

У меня есть таблица Weeks, который присоединен к таблице свойств, Weeks таблица вида: -Laravel Eloquent, возвращают строки, в которых оба условия истинны

PropID, WeekDate, Available 

1  , 2015-07-04,  Yes 

1  , 2015-07-11,  Yes 

1  , 2015-07-18,  No 

2  , 2015-07-04,  Yes 

2  , 2015-07-11,  No 

2  , 2015-07-18,  No 

Я хочу, чтобы выбрать свойства, где обе недели 4-го и 11-го. В приведенном выше примере я хочу вернуть две строки с помощью PropID 1, поскольку они доступны, и нет строк из PropID 2, поскольку доступна только одна из недель.

Я пробовал различные способы, но либо ничего не получал, либо всегда возвращал 1, 2 и 4 строки.

Я думаю, что это близко, но он по-прежнему не хватает что-то, как он ищет даты, которые < = И> =

$query = Property::whereHas('Week', function($q) use ($arrive) 
      { 
       $q->where(function($sub) 
       { 
        $sub->where('WeekDate', '>=', '2015-07-04'); 
        $sub->where('WeekDate', '<=', '2015-07-11'); 

       }); 
       $q->where('Available', '=', 'Yes'); 
      }) 
       ->get(); 

Не уверен, что это помогает, но таблица недвижимости просто

PropID, PropName 

    1  , Property 1 

    2  , Property 2 

Просто нашел, что этот SQL работает.

ВЫБОР PropID ОТ tblweeks ГДЕ WeekDate В ('2015-07-04', '2015-07-11') и группы Available = 'да' ПО PropID HAVING COUNT (*) = 2

+0

Можете ли вы поделиться своими образцами данных надлежащего ty table? Удивление, если это может быть полезно! –

+0

Можете ли вы опубликовать свой код модели. – whoacowboy

+0

Также, учитывая, что WeekDate является датой, можете ли вы подтвердить, что это правда? – whoacowboy

ответ

1

Это даст свой результат как Недвижимость 1 только:

$weeks = Property::whereHas('Week', function ($q) { 
    $q->where(function ($sub) { 
     $sub->whereIn('WeekDate', array('2015-07-04', '2015-07-11')); 
     $sub->where('Available', '=', 'y'); 
    }); 
    $q->groupBy('property_id'); 
    $q->having('count(*)', '=', '2'); 
})->get(); 
+0

Извините, в таблице примеров должно отображаться «Да», а не «Y». –

+0

Обновленный вопрос, чтобы полностью показать структуру таблицы. –

+0

@PaulWright Я обновил свой ответ в соответствии с вашим sql. Я обновил данные и код на своей рабочей станции и протестировал это. Это дает свойство 1. –

0

Я что вам не нужен второй вложенный запрос.

$query = Property::whereHas('Week', function($q) use ($arrive) 
{ 
    $q->where('WeekDate', '>=', '2015-07-04'); 
    $q->where('WeekDate', '<=', '2015-07-11'); 
    $q->where('Available', '=', 'Yes'); 
}) 
->get(); 

Обновлено

Вы смотрели в whereBetween.

$query = Property::whereHas('Week', function($q) use ($arrive) 
{ 
    $q->whereBetween('WeekDate', '2015-07-04', '2015-07-11'); 
    $q->where('Available', '=', 'Yes'); 
}) 
->get(); 
+0

Это не имеет никакого значения (хотя вы правы, вложенное место, где бесполезно) – lukasgeiter

+0

Нет, Извините, это просто дает строки, где Доступно = Да, а дата - одна. –

0

Есть некоторые изменения я сделал в запросе:

Пожалуйста, проверьте это решение

$query = Property::whereHas('Week', function($q) use ($arrive) 
{ 
    $q->where('WeekDate', '=', '2015-07-04'); 
    $q->orWhere('WeekDate', '=', '2015-07-11'); 
    $q->where('Available', '=', 'Yes'); 
}) 
->get(); 

Это должно работать и будет возвращать выход желание

+0

Нет, извините, что дает ('WeekDate' = '2015-07-04' или' WeekDate' = '2015-07-11' и 'Available' = 'Yes'). –

0

Есть некоторые изменения, запрос может быть с помощью группы по запросу:

Пожалуйста, проверьте это решение

$query = Property::whereHas('Week', function($q) use ($arrive) 
{ 
    $q->where('WeekDate', '=', '2015-07-04'); 
    $q->orWhere('WeekDate', '=', '2015-07-11'); 
    $q->where('Available', '=', 'Yes'); 
    $q->group('WeekDate'); 
}) 
->get(); 

Это должно работать и будет возвращать выходное желание

0

Вы на самом деле нужно два whereHas для этого:

$query = Property::whereHas('Week', function($q) use ($arrive) 
        { 
         $q->where('WeekDate', '>=', '2015-07-04'); 
         $q->where('Available', '=', 'Yes'); 
        }) 
        ->whereHas('Week', function($q) use ($arrive) 
        { 
         $q->where('WeekDate', '<=', '2015-07-11'); 
         $q->where('Available', '=', 'Yes'); 
        }) 
        ->get(); 
+0

Нет, извините, что не дает правильного результата, получив все с помощью Available = Yes для этих дат. –

+0

Хм, тогда я, вероятно, неправильно понял ваш вопрос ... – lukasgeiter

+0

Верните только строки, когда они доступны для дат BOTH. Спасибо за вашу помощь по этому поводу. Сводит меня с ума. Теперь я обновил вопрос с SQL, который работает, если это помогает понять. –

Смежные вопросы