首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果第二个表与连接条件不匹配,则laravel从第一个表获取结果

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

Stack Overflow用户
提问于 2018-05-08 14:57:31
回答 2查看 2.4K关注 0票数 3

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

我有两个表食品和food_translation,在food_translation表食品名称保存在不同的语言和食品表的默认名称。

如果food_translation表中的语言条件不匹配,则需要从食品表中获取食品default_name

代码语言:javascript
运行
复制
$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();
EN

回答 2

Stack Overflow用户

发布于 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。

代码语言:javascript
运行
复制
$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可能如下所示

代码语言:javascript
运行
复制
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' )
票数 2
EN

Stack Overflow用户

发布于 2018-05-08 18:32:09

代码语言:javascript
运行
复制
->orWhere('food_translation.locale', '=', 'ar')

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50227660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档