gpt4 book ai didi

laravel - 在数据透视表上使用 hasManyThrough 检索相关模型 - Laravel 5.7

转载 作者:行者123 更新时间:2023-12-04 13:43:36 25 4
gpt4 key购买 nike

我正在尝试从数据透视表中检索相同类型的相关模型。

我有 2 个型号,App\Models\UserApp\Models\Group和枢轴模型 App\Pivots\GroupUser
我的表具有以下结构

用户

  • id

  • 团体
  • id

  • 组用户
  • id
  • 用户 ID
  • group_id

  • 我目前已将关系定义为

    在 app/Models/User.php
    public function groups()
    {
    return $this->belongsToMany(Group::class)->using(GroupUser::class);
    }

    在 app/Models/Group.php
    public function users()
    {
    return $this->belongsToMany(User::class)->using(GroupUser::class);
    }

    在 app/Pivots/GroupUser.php
    public function user()
    {
    return $this->belongsTo(User::class);
    }

    public function group()
    {
    return $this->belongsTo(Group::class);
    }

    我试图在我的 User 中定义一种关系类以访问在同一组中相关的所有其他用户。打电话 friends .到目前为止,我已经尝试过这个:

    应用程序/模型/User.php
    public function friends()
    {
    return $this->hasManyThrough(
    User::class,
    GroupUser::class,
    'user_id',
    'id'
    );
    }

    但它最终只会返回一个只有我调用关系的用户的集合。 (同运行 collect($this);
    我有一个可行但并不理想的解决方案。

    应用程序/模型/User.php
    public function friends()
    {
    $friends = collect();
    foreach($this->groups as $group) {
    foreach($group->users as $user) {
    if($friends->where('id', $user->id)->count() === 0) {
    $friends->push($user);
    }
    }
    }

    return $friends;
    }

    有什么方法可以使用 hasManyThrough 来完成此操作吗?或其他一些 Eloquent 功能?

    谢谢。

    最佳答案

    你不能用 hasManyThrough 做到这一点因为users上没有外键表将其与 id 相关联的group_user table 。您可以尝试使用现有的 belongsToMany 从用户到他们的群组再到他们的 friend 。关系:

    应用程序/模型/User.php:

    // create a custom attribute accessor
    public function getFriendsAttribute()
    {
    $friends = $this->groups() // query to groups
    ->with(['users' => function($query) { // eager-load users from groups
    $query->where('users.id', '!=', $this->id); // filter out current user, specify users.id to prevent ambiguity
    }])->get()
    ->pluck('users')->flatten(); // massage the collection to get just the users

    return $friends;
    }

    然后当您拨打 $user->friends您将获得与当前用户在同一组中的用户集合。

    关于laravel - 在数据透视表上使用 hasManyThrough 检索相关模型 - Laravel 5.7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53093908/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com