【问题标题】:Laravel - Select specific columns from joined relationship models using EloquentLaravel - 使用 Eloquent 从连接关系模型中选择特定列
【发布时间】:2019-06-15 00:01:37
【问题描述】:

我正在尝试从使用 Eloquent 连接的表中选择特定列。

我有 3 个模型 - 交易 - 渠道 - 商人

交易链接到频道。它有一个 hasOne 关系。 渠道链接到商家。它也有一个 hasOne 关系。

public function channel() {
    return $this->hasOne(Channel::class, 'uuid', 'entityId');
}

public function merchant() {
    return $this->hasOne('App\Merchant', 'uuid', 'sender');
}

我正在使用急切加载,因此在事务模型中有以下内容:

protected $with = ['channel'];

频道有:

protected $with = ['merchant']:

这是我试图转换为 Eloquent 的查询,但我不确定当它们属于相关模型时如何选择列。我不明白的是,如果已经定义了关系,为什么我不能从其他模型中选择列而不必重用连接或 with 子句?

SELECT SUM(t.amount) AS amount, 
       m.name 
FROM transactionsV2 t JOIN
     channels c
     ON t.entityId = c.uuid JOIN
     merchants m
     ON c.sender = m.uuid
WHERE t.paymentType = 'DB' AND
      t.status = 1 AND
      t.processing_time >= '2019-01-01' AND
      t.processing_time < '2019-01-21'
GROUP BY m.name;

【问题讨论】:

  • 我见过这个,但我在模型中声明了“with”。为什么我需要在查询中再次声明它?
  • Laravel 使用多个查询来获取关系,它没有使用 JOIN 语句。这就是为什么您不能如此轻松地使用相关模型中的列

标签: laravel laravel-5 eloquent


【解决方案1】:

您可以使用protected $with = ['merchant:id,name']; 之类的方法,或者使用raw expressions 之类的方法selectRaw('SUM(t.amount) AS amount, m.name)

【讨论】:

    【解决方案2】:

    你可以试试这样的:

    Transaction::sum('amount')
        ->whereStuf(...)
        ->with(['channel.merchant' => function($query){
            $query->select('name')
                ->groupBy('name');
        }])->get();
    

    channel.merchant 允许您获取嵌套关系。

    【讨论】:

    • 这是我以前做过的,它有效,但我已经在模型本身中声明“with”为受保护的属性,所以我为什么要在查询中再次这样做。
    • 看我的评论,Laravel 将使用多个查询来获取您的with 关系。所以你不能查询这些列,因为它们不包含在全局查询中。您必须使用闭包。
    • 如果是这样,为什么还要在模型中声明 with 为受保护的属性?你每次都会重复自己。
    • with 允许预加载,并且在 95% 的情况下足够方便(只需获取关系数据)。你可以做的是在你的模型中编写你自己的关系函数来简化它。
    • 如果我想在选择中包含merchant.name怎么办?您的代码有效,但我希望能够指定列名?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 2021-12-24
    • 2013-04-03
    • 2015-05-08
    • 2014-04-11
    • 1970-01-01
    • 2022-10-05
    相关资源
    最近更新 更多