Laravel запрос в БД с помощью Query Builder

347
22 апреля 2017, 23:16

Всем привет. Осваиваю Laravel и столкнулся с следующей проблемой. Есть запрос на Query Builder, который вытягивает информацию с БД. Пример:

public function getFoodTypesListByCountObject($countryId = false, $cityId = false, $regionId = false, $dateFrom = false, $dateTo = false, $person = false)
{
    $objectsFoodTypes = DB::table('food_types AS ft')
        ->select('ft.id', 'ft.name', DB::raw('count(DISTINCT o.id) as countObject'))
        ->join('objects AS o', 'ft.id', '=', 'o.foodTypesId')
        ->join('rooms AS r', 'o.id', '=', 'r.objectId')
        ->where([
            ['o.countryId', '=', $countryId],
            ['o.cityId', '=', $cityId],
            ['o.regionId', '=', $regionId],
            ['o.person', '=', $person],
        ])
        ->groupBy('ft.id')
        ->get();
    return $objectsFoodTypes;
}

Из реквеста приходят параметры, от которых зависит вывод информации на страничке. Не могу разобраться как в Laravel исключать параметр из массива where([['o.person', '=', $person]]) , если например вместо значения параметра $person пришел false. В сыром запросе можно делать все так:

public function getListObjects($countryId, $cityId = false, $regionId = false, $dateFrom = false, $dateTo = false, $person = false) {
    $sql = "SELECT *
                            FROM objects AS o
                            JOIN cities AS c ON o.`cityId` = c.`id`                               
                            WHERE 
                                    o.`valuePercent` =  50 ".
                            (($countryId) ? " AND c.countryId = " . $countryId : "") .
                            (($cityId) ? " AND c.id = " . $cityId : "") .
                            (($regionId) ? " AND c.regionId  = " . $regionId : "") .
                            (($person) ? " AND r.amountPerson  = " . $person : "") .                                
                            AND (o.price > 0 AND o.price <=2000)
                            GROUP BY o.id";
    $objects = DB::select($sql);
    return $objects;
}

Подскажите как средствами Laravel подобное, на примере первого запроса?

Answer 1

Можно Query Builder разбить на части и тогда спокойно делать ваши проверки:

$query = DB::table('food_types AS ft')
    ->select('ft.id', 'ft.name', DB::raw('count(DISTINCT o.id) as countObject'))
    ->join('objects AS o', 'ft.id', '=', 'o.foodTypesId')
    ->join('rooms AS r', 'o.id', '=', 'r.objectId');
if ($person) {
    $query->where('o.person', $person);
}
//Остальные проверки по аналогии с этой
$objectsFoodTypes = $query->groupBy('ft.id')->get();
READ ALSO
Как создать бота на Java который работает с приложением (не Java)?

Как создать бота на Java который работает с приложением (не Java)?

Как создать бота на Java который работает с приложением (не Java)? Суть самого бота будет очень проста, каждые 9 минут он должен делать шаг вперед,...

331
Android. Activity или Fragment?

Android. Activity или Fragment?

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

340
Как разделить логику unit тестирования?

Как разделить логику unit тестирования?

На текущий момент в Application имею следующий фрагмент кода:

307
Как найти пересечение и и число принадлежащее этого пересечения

Как найти пересечение и и число принадлежащее этого пересечения

Подскажите новичку как дальше приступить к решению

386