Laravel - 使用 Eloquent 从连接关系模型中选择特定列
Posted
技术标签:
【中文标题】Laravel - 使用 Eloquent 从连接关系模型中选择特定列【英文标题】:Laravel - Select specific columns from joined relationship models using 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;
【问题讨论】:
How to select columns from joined tables: laravel eloquent的可能重复 我见过这个,但我在模型中声明了“with”。为什么我需要在查询中再次声明它? Laravel 使用多个查询来获取关系,它没有使用 JOIN 语句。这就是为什么您不能如此轻松地使用相关模型中的列 【参考方案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怎么办?您的代码有效,但我希望能够指定列名?以上是关于Laravel - 使用 Eloquent 从连接关系模型中选择特定列的主要内容,如果未能解决你的问题,请参考以下文章
限制从 Laravel Eloquent 中连接的表/模型返回的字段
Laravel Eloquent:如何从连接表中仅获取某些列
Laravel Eloquent 在与其他表连接后从关系中选择字段