Запрос наличия отношений, как добавить условия в зависимости от длины массива - PullRequest
0 голосов
/ 14 мая 2018

Я бы хотел отфильтровать элемент (в данном случае пабы) по некоторым характеристикам, которые хранятся в отдельной таблице (в нашем случае это tapps), и оба они связаны pub_tapps.

У меня есть следующие таблицы: pubs, tapps, pub_tapps (pub_id, tapp_id)

Отношение между Pub и Tapp следующее:

 public function pubTapps()
{
    return $this->belongsToMany(Tapp::class, 'pub_tapps');
}

в моем пабеМодель Я попробовал следующее тестирование для массива $ request = [5,8, 7]:

public function pubsFilteredByTapps(FilteredTappsPubsRequest $request)
{
    $tapps_chosen = $request->get('tapps');

    $tapps_chosen = is_string($tapps_chosen) ? explode(',', str_replace('"', '', $tapps_chosen)) : $tapps_chosen;

    return Pub::whereHas('pubTapps', function($query) use($tapps_chosen) {
        $query->where('tapp_id', $tapps_chosen[0]);
    })
        ->whereHas('pubTapps', function($query) use($tapps_chosen) {
            $query->where('tapp_id', $tapps_chosen[1]);
        })
        ->whereHas('pubTapps', function($query) use($tapps_chosen) {
            $query->where('tapp_id', $tapps_chosen[2]);
        })
        ->get();
}

Это работает отлично, но для данного трехмерного массива ...

Как я могу сделать для массива длины n ??

Я пробовал это, но не работает вообще (возвращает пустой массив):

return $pubs = Pub::whereHas('pubTapps', function ($query) use 
     ($tapps_chosen) {

        foreach ($tapps_chosen as $tappId) {
            $query->where('tapp_id', $tappId);
      }
       })->get();

Что бы я имелсделать???Любые идеи, чтобы заставить это работать ??

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Используйте это:

$query = Pub::query();
foreach ($tapps_chosen as $tappId) {
    $query->whereHas('pubTapps', function($query) use($tappId) {
        $query->where('tapp_id', $tappId);
    });
}
return $query->get();
0 голосов
/ 14 мая 2018

Как насчет этого?

public function pubsFilteredByTapps(FilteredTappsPubsRequest $request)
{
    $tapps_chosen = $request->get('tapps');

    $tapps_chosen = is_string($tapps_chosen) ? explode(',', str_replace('"', '', $tapps_chosen)) : $tapps_chosen;

    return Pub::whereHas('pubTapps', function($query) use($tapps_chosen) {
        $query->whereIn('tapp_id', explode(',' $tapps_chosen));
    })->get();
}

Таким образом, если у вас есть любое количество идентификаторов в массиве, eloquent сгенерирует запрос с предложением IN, и вы получите правильный результат.

...