Laravel - Eloquent 关系有很多但也有一个?

Laravel - Eloquent Relationship hasMany but also hasOne?

我浏览了整个网络并为此苦苦挣扎了大约 2 个小时。

我有一个 USER 模型,一个 运行 模型和一个 TIME 模型。

在现实世界中,用户正在参加比赛,他们的时间连同 USER_id 和 RUN_id.

一起输入到数据库中

对于每个 RUN_id,用户在 TIMES table 中只能有一行 - 如果这有意义的话!

这是我需要在控制器级别管理的东西吗?或者我可以设置一个关系来确保这种样式的重复条目不能进入数据库?

目前数据库结构:


用户:

姓名


运行S:

姓名


次:

时间

user_id

run_id


模特们:

用户:

public function times()
{
    return $this->hasMany(Time::class);
}

运行:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Run extends Model
{    
    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function times()
    {
        return $this->hasMany(Time::class);
    }
}

时间:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Time extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function run()
    {
        return $this->belongsTo(Run::class);
    }

}

您可以在 times table 上添加唯一键约束以强制执行 user_id 和 run_id

的唯一组合
$table->unique(['user_id, 'run_id']);

为了在应用程序级别验证唯一性,我们还可以在表单验证中添加一个约束。假设您在创建新时间的请求中同时传递 user_id 和 run_id,您可以将以下内容添加到表单请求

/**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'user_id' => Rule::unique('times')->where('run_id', $this->input('run_id'))
        ];
    }

    public function messages()
    {
        return [
            'user_id.unique' => 'A user may only have 1 time entry per Run'
        ];
    }

这将强制 user_id 在 times table 中是唯一的,由 运行 id 过滤。 messages 函数也是 returns 更有用的错误消息,因为 "user_id must be unique" 在这种情况下没有帮助。

此答案应补充已接受的答案。您仍应将 user_id、run_id 对定义为唯一键。 但是,在您的情况下,用户和 运行 以 times 作为枢轴 table 具有 N-N 关系。你应该这样编码。

用户

public function runs()
{
    return $this->belongsToMany(Run::class, 'times')->withPivot('time');;
}

运行:

public function users()
{
    return $this->belongsToMany(User::class, 'times')->withPivot('time');
}

然后您可以将它们检索为:


$runs = User::find($userId)->runs; // Collection of all runs a user participated in
// $runs[X]->pivot->time has the time

您可以查看 the documentation 了解更多信息