Так, когда текущий язык пользователя. является арабским, вы хотите показать арабское название еды, но в случае, если оно не существует, покажите им имя по умолчанию. В этом сценарии вы никогда не можете использовать предложение 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' )