Laravel 用户有多个用户 class

Laravel User Has Many User class

我想知道以下用例以及在 Laravel 中实现此用例的最简单、最优雅的方法。

基本上我会有一个用户table

id, name, email, password

我还将创建一个 SuggestedUser 模型,以便向用户建议用户想要关注的用户以及他们应该关注该用户的原因。

id user_id, suggested_id, reason

在我的用户中class将这两者联系起来很简单

    public function suggestedUsers()
    {
        return $this->hasMany(SuggestedUser::class);
    }

所以现在我可以做到了

$user->suggestedUsers 并得到枢轴的结果table

=> Illuminate\Database\Eloquent\Collection {#1881
     all: [
       App\Models\PartnerSuggestion {#1939
         id: 1,
         user_id: 1,
         partner_id: 86,
         reason: "You liked similar posts",
         created_at: null,
         updated_at: null,
       },
     ],
   }

但我实际上想要做的是从中 return User::class 的集合而不是枢轴的集合。

这样当我执行 $user->suggestedUsers 时,我会得到这样的结果包括原因

Illuminate\Database\Eloquent\Collection {#1940
     all: [
       App\Models\User {#1941
         id: 86,
         first_name: "Eugene",
         last_name: "Simonis",
         reason: "You liked similar posts"
       },
       App\Models\User {#1942
         id: 95,
         first_name: "Wilfred",
         last_name: "Stamm",
         reason: "They viewed your profile"

       },
     ],
   }

我的问题是最干净、最优雅的方法是什么?我是否需要摆脱枢轴 table 并建立一个引用自身的关系?我研究过诸如 baum 之类的软件包,但出于某种原因(上次活跃是在 4 年前),我宁愿在没有软件包的情况下这样做

我设法通过使用多态关系和特征解决了这个问题。

trait HasSuggestions
{
    public function suggestions()
    {
        return $this->morphMany(PartnerSuggestion::class, 'user');
    }

    public function suggest(Model $suggestedUser)
    {

        $suggestion = (new UserSuggestion())->fillSuggestion($suggestedUser)->fill([
            'reason' => 'reason',
        ]);
        $this->suggestions()->save($suggestion);
        return $suggestion;
    }
}

然后在我的数据库中我使用变形字段而不是 id 字段

$table->morphs('user');
$table->morphs('suggested_user');

通过使用这个特性,我仍然得到相同的结果,但我现在可以在上面添加一个使用查询构建器的新方法,这样我就可以创建很多查询

例如:

$user->getSuggested
$user->getSuggestedByDate

等等

在我看来,你把事情复杂化了。可能是,您不需要整个模型来解决您的问题。

您真正想要实现的是双方.

与用户模型的多对多关系

Laravel 中的这种关系被以下用户模型引用:

public function usersIsSuggestedTo() {
    return $this->belongsToMany(User::class, 'suggested_user', 'suggested_id', 'user_id');
}

public function suggestedUsers() {
    return $this->belongsToMany(User::class, 'suggested_user', 'user_id', 'suggested_id');
}

您还需要为 suggested_user table 创建迁移。

然后,您将使用 $user->suggestedUsers 访问 suggestedUsers 的集合,并使用 $user->suggestedUsers->pivot.[=19 访问枢轴 table(这是加入它们的 table) =]

在您查询的集合中获得 reason

您还可以在您的关系中使用 ->withPivot('reason')reason 字段附加到您的关系中,如下所示:

return $this->belongsToMany(User::class, 'suggested_user', 'user_id', 'suggested_id')->withPivot('reason');

-

当您不需要拥有整个模型时就是这种情况,例如当您使用建议的用户时 table 仅用于存储原因字段和关系本身。

官方文档的link可能对您有所帮助: https://laravel.com/docs/7.x/eloquent-relationships#many-to-many