【发布时间】:2021-11-08 03:08:13
【问题描述】:
我只是想知道,我可以在 Laravel 上使用查询构建器创建“雄辩的关系”吗?有没有办法做到这一点?
示例:
我有两张桌子
users
========
user_id
user_name
events
========
event_id
event_name
user_id
我知道如果我想选择事件并想向创建事件的用户展示我可以这样做
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Model
{
public function events() {
return $this->belongsTo(Event::class, 'user_id', 'user_id');
}
}
在Controller中我可以这样称呼它
User::find(1)->with('events');
但在这种情况下,我有一个复杂的查询并加入 3 个表,我担心复杂性,所以我只想使用查询生成器而不是 eloquent,但是有没有办法让它像 eloquent 的行为一样?
期望:(我知道这是一个错误的查询,但有办法做到吗?)
DB::select('select * from users where user_id = ?', [1])->with('events');
预期结果示例:
user: {
user_id: 1,
user_name: 'Mr. Man',
events: [
{
event_id: 1,
event_name: 'Birthday Party'
},
{
event_id: 2,
event_name: 'Honey Moon'
}
]
}
编辑:
我想我也必须像我的情况一样说清楚,这是我所期望的
我有三张桌子
users
=====
user_id
events
======
event_id
user_id
event_location
event_date
event_organizers
================
event_organizer_id
event_organizer_name
package_event_organizers
========================
package_event_organizer_id
event_organizer_id
package_event_organizer_name
我的期望
events: [
{
event_organizer_id: 1,
event_organizer_name: 'Wedding',
event_location: 'New York',
event_date: '2021/09/12',
package_event_organizers: [
{
package_event_organizer_id: 1,
package_event_organizer_id: 'Wedding Package 1',
},
{
package_event_organizer_id: 2,
package_event_organizer_id: 'Wedding Package 2',
}
]
},
{
event_organizer_id: 1,
event_organizer_name: 'Wedding',
event_location: 'San Fransisco',
event_date: '2021/10/12',
package_event_organizers: [
{
package_event_organizer_id: 1,
package_event_organizer_id: 'Wedding Package 1',
},
{
package_event_organizer_id: 2,
package_event_organizer_id: 'Wedding Package 2',
}
]
},
{
event_organizer_id: 2,
event_organizer_name: 'Sweet 17',
event_location: 'Chicago',
event_date: '2021/11/12',
package_event_organizers: [
{
package_event_organizer_id: 1,
package_event_organizer_id: 'Sweet 17 Package 1',
},
{
package_event_organizer_id: 2,
package_event_organizer_id: 'Sweet 17 Package 2',
}
]
}
]
【问题讨论】:
-
不,你不能这样做。另外,您为什么要这样做?这里的用例不清楚。
-
您好,感谢您的关注。我想这样做是因为我想返回一个我需要加入 3 个表的数据集合,之后每个对象也会有数据集合
-
是的,我不明白为什么不用 eloquent 而不是 joins
-
目前,我仍然使用 eloquent,但我只是想知道我能否让查询生成器表现得像 eloquent。我从一些资源中读到它说使用 eloquent 的关系太多会增加复杂性
-
这句话过于宽泛,实际上没有意义。 3 次连接通常比在 3 种不同的关系上执行
with慢,因为您从连接中获得所有冗余数据,所以它是否更慢取决于用例。
标签: php laravel eloquent query-builder laravel-query-builder