laravel получить результат из первой таблицы, если вторая таблица не соответствует условию соединения - PullRequest
0 голосов
/ 08 мая 2018

У меня есть требование, где мне нужно получить результат из первой таблицы, если объединенная таблица, где условие не удовлетворяет.

У меня есть две таблицы food и food_translation, в таблице food_translation названия продуктов сохранены на разных языках и имя по умолчанию в таблице food.

если языковые условия не совпадают в таблице food_translation, то необходимо получить еду default_name из таблицы food

$food = DB::table('Program')
->leftJoin('Meals', 'Program.meal_id', '=', 'Meals.meals_id')
->leftJoin('Food', 'Meals.food_id', '=', 'Food.food_id')
->leftJoin('food_translation', 'food_translation.food_id', '=', 'Food.food_id')
->select('Food.food_id','Food.food_name','food_translation.food_ame','Food.default_name')
->where('food_translation.locale', '=', 'ar')->get();

Ответы [ 2 ]

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

Так, когда текущий язык пользователя. является арабским, вы хотите показать арабское название еды, но в случае, если оно не существует, покажите им имя по умолчанию. В этом сценарии вы никогда не можете использовать предложение where, потому что независимо от объединения предложение where исключит все и все строки в результате объединения, которые не совпадают (даже если используются левые объединения). Если ни одна строка в таблице food_translation не имеет locale = 'ar', следовательно, в результате объединения также ни одна строка не будет иметь locale = 'ar', в результате все получает устранена.

Вместо этого вам нужно добавить locale = 'ar'part в само условие соединения, это даст вам только те строки food_translation, которые имеют locale =' ar ', но не влияют на результаты других объединений таблиц. . Затем используйте COALESCE () (или IFNULL () ), передавая food_translation.food_name в качестве 1-го и Food.food_name в качестве второго параметра, поэтому, если food_translation.food_name не равно NULL, он будет использоваться в противном случае Food.food_name used.

$food = DB::table('Program')
    ->leftJoin('Meals', 'Program.meal_id', '=', 'Meals.meals_id')
    ->leftJoin('Food', 'Meals.food_id', '=', 'Food.food_id')

        ->leftJoin('food_translation', function ($join) {
                $join->on('food_translation.food_id', '=', 'Food.food_id');
                $join->on('food_translation.locale', '=', 'ar');
        })

    ->select('Food.food_id','Food.food_name', DB::raw('COALESCE(food_translation.food_name,Food.default_name) as foodname')
    )->get();

В целом ваш сырой sql может выглядеть так

SELECT  COALESCE(food_translation.food_name, Food.default_name) as foodname,Food.food_id  
from program

left join meals on meals.meals_id = program.meal_id

left join food on food.food_id = meals.meals_id

LEFT JOIN food_translation on ( food_translation.food_id = food.food_id and food_translation.locale = 'ar' )
0 голосов
/ 08 мая 2018
->orWhere('food_translation.locale', '=', 'ar')

используйте orWhere, затем проверьте результат и возьмите food_name.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...