【发布时间】:2022-06-10 20:21:47
【问题描述】:
我的架构的简化版本如下所示:
活动
- event_id
- 标题
预订
- booking_id
- event_id
参与者
- participant_id
- booking_id
用户
- user_id
- 姓名
用户通过participant记录预订活动,这些记录属于booking记录,是event的子记录> 记录。
我正在尝试在 Event 模型上编写一个方法来返回事件中的所有用户,作为 Eloquent 关系。我希望它是 Eloquent,所以我可以链接 where 子句等,以进一步过滤结果集。
我在 Event 模型上有一个参与者() 方法,看起来像这样:
public function participants(): \Illuminate\Database\Eloquent\Relations\HasManyThrough
{
return $this->hasManyThrough(
Participant::class,
Booking::class,
'event_id',
'booking_id',
'participant_id',
'booking_id'
);
}
这可行,并返回一个 HasManyThrough,我可以遍历它,或者进一步使用。
我的问题是尝试创建一个 users() 方法,而无需启动新的查询构建器。 我想将一些东西链接到参与者()方法,让用户附加到每个参与者,并将这个集合作为 Eloquent 关系返回。
我意识到我可以执行以下操作,但我最终以这种方式得到了一个简单的对象数组,而不是一个可查询的 Eloquent 关系。这意味着我失去了我想要的 ORM 功能。
public function users()
{
$users = [];
foreach($this->participants as $participant){
$users[] = $participant->user;
}
return $users;
}
作为参考,我的 Participant 模型如下所示:
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Participant extends Model
{
use HasFactory;
public function booking(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{
return $this->belongsTo(Booking::class, 'booking_id', 'booking_id');
}
public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo
{
return $this->belongsTo(User::class, 'user_id', 'user_id' );
}
}
如何将我的参与者收藏变成用户?是否可以“手动”构建 Eloquent 关系(或集合)?
【问题讨论】:
-
我想你要找的是一个属于多方面的关系吗?
$event = Event::with('bookings.users')用户预订关系类似于return $this->belongsToMany(User::class, 'participants') -
给我看看你的模型?
标签: php laravel eloquent eloquent-relationship