如果第二个表与连接条件不匹配,则laravel从第一个表获取结果

时间:2018-05-08 06:57:31

标签: php mysql laravel

如果条件不满足的联接表,我需要从第一个表中获取结果。

我有两个餐桌食物和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();

2 个答案:

答案 0 :(得分:2)

所以当用户当前的lang。是阿拉伯语你想要显示食物的阿拉伯名称但是如果它不存在则显示它们的默认名称。在这种情况下你永远不能使用where子句,因为无论连接如何where子句将消除连接结果中不匹配的任何和所有行(即使使用左连接)。如果food_translation表中的行没有locale ='ar'因此在连接结果中也没有行将locale ='ar'as结果一切都消失了。

你需要做的是在连接条件本身添加locale ='ar'part这将只给你那些具有locale ='ar'但不影响其他表连接结果的food_translation行。然后使用COALESCE()(或IFNULL())运算符将 food_translation.food_name 作为1st传递, 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' )

答案 1 :(得分:0)

->orWhere('food_translation.locale', '=', 'ar')

使用orWhere,然后检查结果并使用food_name。