Laravel Eloquent Model 相关查询未按预期工作

Posted

技术标签:

【中文标题】Laravel Eloquent Model 相关查询未按预期工作【英文标题】:Laravel Eloquent Model related query not working as intended 【发布时间】:2020-07-03 21:12:29 【问题描述】:

我有两张桌子。 codestranslations

代码表

id | name
---|------
1  | A99

翻译表

id | code_id | language_code | copy
---|---------|---------------|------
1  |1        |en             | Heart Disease
2  |1        |fr             | Sning Nat

代码模型

class Code

  function translation() // for default lanuage
  
   return $this->hasOne(Translation::class, 'code_id')->where('language_code', 'en);
  

查询

$codes = Codes::with(['translation' => function($query)
 $query->where('copy', 'like', '%hltad la loq%');
]);

这应该什么也不返回,但它会返回所有没有翻译的代码。

换句话说,我只想在后台执行此查询。

select codes.*, translations.copy from codes
inner join translations ON codes.id = translations.code_id
where translations.language_code='en'
and translations.copy like '%hltad la loq%'

【问题讨论】:

这能回答你的问题吗? Laravel where on relationship object 不,这个问题与那个无关 我相信确实如此。您没有正确使用 Laravel Eloquent 代码(带有“with”并在其中执行子查询的部分),它在那里显示了应该如何完成。 解决方案是什么? 您的问题和所需 SQL 查询的唯一解决方案是使用 DB::raw/DB::query,因为 Eloquent 使用 eloquent 模型运行,而不是来自不同列的分类集合表。 【参考方案1】:

您正在使用 with 所以它返回第一个表,就像左连接一样。如果你想获得内部连接,你应该这样做:

$codes = Codes::whereHas('translation', function ($join) 
    return $join->where('copy', 'like', '%hltad la loq%');
)->get();

【讨论】:

用toSql()替换get()并检查sql

以上是关于Laravel Eloquent Model 相关查询未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

laravel 数据操作

Laravel Eloquent Model :: find不起作用

Laravel 的 Eloquent 公共静态函数“create”在 Model.php 中发生了啥?

laravel 返回值

Laravel 数据库操作之Eloquent ORM模型

Laravel Eloquent ORM 数据model操作