Laravel 5.7多个外键引用相同的表主键

时间:2018-10-19 15:51:51

标签: php laravel-5.7

我有一个表Task,其中有creatorIDassignedTo。它们都是我的User表的主键u_id的外键。我正在尝试显示creatorIDassignedTo的名称,但是它不起作用,它给出了错误Trying to get property 'name' of non-object。有人能发现我的代码有什么问题吗?我愿意接受任何对我的模型/表的建议或修改,谢谢。

任务表(迁移)

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

用户表(迁移)

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

任务模型

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

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

用户模型

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

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

查询

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

刀片文件

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

1 个答案:

答案 0 :(得分: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 Object模式,可以帮助删除   代码中的条件检查