首页 文章

Laravel 5.7多个外键引用同一个表主键

提问于
浏览
0

我有一个表 Task ,它有 creatorIDassignedTo . 它们都是我的 User 表的主键 u_id 的外键 . 我正在尝试显示 creatorIDassignedTo 的名称,但它不起作用,它给出了错误 Trying to get property 'name' of non-object . 任何能够发现我的代码错误的人?我对我的模型/表格的任何建议或修改都开放了,谢谢 .

Task Table(Migration)

Schema::create('tasks', function (Blueprint $table) {
    $table->increments('t_id');
    $table->string('t_name');
    $table->date('start_date');
    $table->date('end_date');
    $table->string('status');
    $table->unsignedInteger('creatorID');
    $table->unsignedInteger('assignedTo')->nullable();
    $table->unsignedInteger('p_id');
    $table->foreign('creatorID')->references('u_id')->on('users');
    $table->foreign('assignedTo')->references('u_id')->on('users');
    $table->foreign('p_id')->references('p_id')->on('projects');
    $table->string('priority');
    $table->timestamps();
});

User Table(Migration)

Schema::create('users', function (Blueprint $table) {
    $table->increments('u_id');
    $table->string('name');
    $table->string('email')->unique();
    $table->string('password');
    $table->rememberToken();
    $table->string('status');
    $table->string('picture');
    $table->timestamps();
});

Task Model

public function users(){
    return $this->belongsTo('App\User','u_id');
}

public function assignedTo(){
    return $this->belongsTo('App\User','assignedTo');
}

User Model

public function tasks(){
    return $this->hasMany('App\Task','u_id');
}

public function assignedTo(){
    return $this->hasMany('App\Task','assignedTo');
}

Query

$ActiveTasks = Task::where('p_id',$projectID)->where('status','active')->get();

Blade File

@foreach($ActiveTasks as $task)
    <p>{{$task->assignedTo->name}}</p>   <<< NOT WORKING
@endforeach

1 回答

  • 0

    Task 模型中,您可能需要更新 assignedTo() 关系,以便它知道引用 u_id 而不是 id

    public function assignedTo(){
        return $this->belongsTo(\App\User::class, 'assignedTo', 'u_id');
    }
    

    来自docs

    如果您的父模型不使用id作为其主键,或者您希望将子模型连接到其他列,则可以将第三个参数传递给belongsTo方法,以指定父表的自定义键

    此外,因为您的任务的 assignedTo 列可以为空,所以您可能希望查看在定义关系时可以使用的withDefault()方法:

    belongsTo关系允许您定义在给定关系为null时将返回的默认模型 . 此模式通常称为Null对象模式,可以帮助您删除代码中的条件检查

相关问题