0

我已经在整个网络上苦苦挣扎了大约 2 个小时。

我有一个 USER 模型、一个 RUN 模型和一个 TIME 模型。

在现实世界中,用户正在比赛中,并将他们的时间与 USER_id 和 RUN_id 一起输入数据库。

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

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

目前的数据库结构:


用户:

姓名


运行:

姓名


时间:

时间

用户身份

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);
    }

}
4

2 回答 2

3

您可以在表上添加唯一键约束times以强制 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表中是唯一的,由该运行 id 过滤。messages 函数还返回更有用的错误消息,因为“user_id 必须是唯一的”在这种情况下没有帮助。

于 2019-12-17T15:25:15.483 回答
1

该答案应补充已接受的答案。您仍应将 user_id,run_id 对定义为唯一键。times但是,在您的情况下,用户和运行与作为数据透视表具有 NN 关系。你应该这样编码。

用户

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

您可以查看文档以获取更多信息

于 2019-12-17T15:44:29.770 回答