我有一个要求,如果条件不满足的联接表,我需要从第一个表得到结果。
我有两个表食品和食品翻译,在食品翻译表食品名称保存在不同的语言和默认名称在食品表。
如果食物翻译表中的语言条件不匹配,则需要从食物表中获取食物默认名称
$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条答案
按热度按时间pcww981p1#
因此,当用户当前的语言是阿拉伯语时,您希望显示食物的阿拉伯语名称,但如果该名称不存在,请显示默认名称。在这种情况下,您永远不能使用
where
子句,因为不管连接where
子句将删除联接结果中不匹配的所有行(即使使用左联接)。如果转换表中没有行具有locale='ar',则在联接结果中也没有行具有locale='ar',因此所有内容都将被删除。您需要做的是在联接条件本身中添加locale='ar'部分,这将只提供那些locale='ar'但不影响其他表联接结果的food\u翻译行。然后使用coalesce()(或ifnull())操作符将food\u translation.food\u name作为第一个参数,并将food.food\u name作为第二个参数,如果food\u translation.food\u name不能为空,否则将使用food.food\u name。
总之,您的原始sql可能如下所示
bvk5enib2#
使用orwhere,然后检查结果并取食物名称。