【问题标题】:How do I pipe an Eloquent HasManyThrough through another 1:1 relationship我如何通过另一个 1:1 关系来传递 Eloquent HasManyThrough
【发布时间】: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


猜你喜欢
  • 2014-10-31
  • 2020-10-14
  • 2020-02-02
  • 1970-01-01
  • 2021-10-15
  • 2016-09-26
  • 2014-06-15
  • 1970-01-01
  • 2019-03-26
相关资源
最近更新 更多