laravel从第一个表获取结果

llew8vvj  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(265)

我有一个要求,如果条件不满足的联接表,我需要从第一个表得到结果。
我有两个表食品和食品翻译,在食品翻译表食品名称保存在不同的语言和默认名称在食品表。
如果食物翻译表中的语言条件不匹配,则需要从食物表中获取食物默认名称

$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();
pcww981p

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。

$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' )
bvk5enib

bvk5enib2#

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

使用orwhere,然后检查结果并取食物名称。

相关问题