【问题标题】:Can I make an Eloquent model load a relationship with an sql JOIN instead of generating separate sql queries?我可以让 Eloquent 模型加载与 sql JOIN 的关系,而不是生成单独的 sql 查询吗?
【发布时间】:2020-04-23 23:39:09
【问题描述】:

我是一名来自 CakePHP 的开发人员,我使用 Laravel 制作了我的第一个项目。 在 CakePHP 中,当我定义模型及其关系时,有一个选项可以在关系上设置连接策略:strategyjoinselect)。默认情况下,它使用join,当我加载相关模型时,它将通过添加JOIN 语句在单个查询中执行此操作。您可以选择使用select,它会生成一个单独的查询。

现在,当我在 Laravel 中使用预先加载时,例如:

$user = App\User::with(['articles'])->first();

这实际上导致生成两个查询,一个用于获取用户的记录,另一个用于获取关联的文章。这就像我在我的 CakePHP 模型中指定了 select 策略一样。但是,我想改用join 策略,这样我就可以按相关表的列排序或过滤。我还没有找到任何方法来做到这一点。 laravel/eloquent 中是否存在类似的东西?

【问题讨论】:

  • 不可能开箱即用,它需要在 eloquent 中更改大量代码。此外,这种方法对于一对多和多对多关系也没有意义,因为它会加载主模型数据 n 次。
  • @EliasSoares 为什么没有意义?同样,CakePHP 有这个选项,许多其他框架也有这个选项,它们在 n-n、1-n 关系上工作得很好。
  • 它工作,但考虑在 mysql 和 PHP 之间传输的数据。它会更大,因为主模型数据会重复 n 次。

标签: php sql laravel eloquent orm


【解决方案1】:

在 Laravel 中,使用 Joins 获取记录非常简单。 假设左连接是获取记录的示例代码:(您也可以使用任何最适合您需要的连接)

//assuming **title** and **description** as amongst the article fields
// and that you've passed the user's id as **$user_id**
//I've also assumed the articles table has a user id field **user_id** which has the corresponding user's id.
    $user = App\User::leftJoin('articles','users.id','articles.user_id')
->where('users.id',$user_id)
->select('users.*','artcles.title as title','articles.description as description')
->get();

【讨论】:

  • 是的,我知道我可以手动进行连接。但是在我的 eloquent 模型上定义关系的全部意义在于绕过手动编写连接并让 eloquent 为我完成。
猜你喜欢
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多