有 DB::select() 时如何使用 laravel 关系?

Posted

技术标签:

【中文标题】有 DB::select() 时如何使用 laravel 关系?【英文标题】:How to use laravel relations when there is DB::select()? 【发布时间】:2018-04-22 08:30:45 【问题描述】:

这是我的代码:

$guarantee_tickets =  DB::select("(select ga.id, '' as unique_product_id, ga.user_id, ga.submit_time, '' as title, ga.description, '' as  tracking_code, '' as closed, '' as close_date, ga.isAdminNote from guarantee_tickets_answers ga where guarantee_tickets_id = $request->id order by ga.id desc)
                                   union all
                                  (select gt.id, gt.unique_product_id, gt.user_id, gt.submit_time, gt.title, gt.description, gt.tracking_code, gt.closed, gt.close_date, '' from guarantee_tickets gt where id = $request->id)");

还有这个:

dd($guarantee_tickets->user->name);

抛出:

未定义属性:stdClass::$user

我该如何解决?


注意到我在 guarantee_ticketsguarantee_tickets_answers 模型中都有这个:

public function user()

    return $this->hasOne(User::class, 'id', 'user_id');

【问题讨论】:

DB::Select 没有使用 Eloquent,它正在执行原始查询。 你不能有一个雄辩的集合有两个不同的模型。如果你只想要一个模型,你可以使用Model::hydrateRaw()而不是DB::select() 【参考方案1】:

当您使用DB::Select 执行查询时,您正在对数据库执行原始 SQL 查询。您将收到stdClass 的实例,该实例具有来自数据库的属性。你可以阅读更多关于这个here的信息。

如果您希望能够访问这些关系,那么您需要执行 Eloquent 查询来加载数据。

【讨论】:

以上是关于有 DB::select() 时如何使用 laravel 关系?的主要内容,如果未能解决你的问题,请参考以下文章

谁有看过Lara in trouble

如何在具有子查询的以下查询中不使用 DB

如何在 Laravel 的 DB::Select() 中按变量添加 SQL 查询

如何在 Cell 调制解调器上接收小区广播消息?

在刀片中显示 laravel DB::select 数组

DB::Table 和 DB::Select 之间的区别