我有一个要求,如果连接的表where条件不满足,我需要从第一个表中获取结果。
我有两个表食品和food_translation,在food_translation表食品名称保存在不同的语言和食品表的默认名称。
如果food_translation表中的语言条件不匹配,则需要从食品表中获取食品default_name
$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();
发布于 2018-05-09 01:50:52
所以当用户的当前语言。如果您想要显示食物的阿拉伯名称,但是如果它不存在,则向他们显示默认的语言环境。在这种情况下,您永远不能使用where
子句,因为无论连接如何,where
子句都会消除连接结果中不匹配的所有行(即使使用左连接).If food_translation表中没有行的locale = 'ar‘,因此在连接结果中也没有行的locale = 'ar’,因此一切都会被消除。
相反,您需要做的是在连接条件本身中添加locale = 'ar‘部分,这将只给出那些具有locale =’ar‘的food_translation行,但不会影响其他表连接的结果。.Then使用COALESCE() (或IFNULL())操作符,将food_translation.food_name作为第一个参数,将Food.food_name作为第二个参数,因此如果food_translation.food_name不为null,则使用它,否则使用Food.food_name。
$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' )
发布于 2018-05-08 18:32:09
->orWhere('food_translation.locale', '=', 'ar')
使用orWhere,然后检查结果并获取food_name。
https://stackoverflow.com/questions/50227660
复制相似问题