Laravel 5.7 Несколько внешних ключей ссылаются на один и тот же первичный ключ таблицы - PullRequest
0 голосов
/ 19 октября 2018

У меня есть таблица Task, где она имеет creatorID и assignedTo.Оба они являются внешними ключами первичного ключа моей User таблицы u_id.Я пытаюсь отобразить имена creatorID и assignedTo, но он не работает, выдал ошибку 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();

Файл Blade

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

1 Ответ

0 голосов
/ 20 октября 2018

Вам может потребоваться обновить отношение assignedTo в вашей модели Task, чтобы оно могло ссылаться на u_id вместо id:

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

Согласно документации:

Если ваша родительская модель не использует id в качестве своего первичного ключа или вы хотите присоединить дочернюю модель к другому столбцу, вы можете передать третий аргумент методу ownTo, определяющему пользовательский ключ вашей родительской таблицы

https://laravel.com/docs/5.7/eloquent-relationships#defining-relationships

Вам также следует проверить таблицу задач, чтобы увидеть, является ли столбец assignedTo пустым для какой-либо из сохраненных записей.Поскольку у вас установлен атрибут nullable, любые записи, имеющие нулевое значение в assignedTo, также приводят к ошибке Trying to get property 'name' of non-object при обращении к связи.В этом случае вы можете определить отношение, используя метод withDefault():

Отношение belongsTo позволяет определить модель по умолчанию, которая будет возвращена, если данное отношение равно нулю.Этот шаблон часто называется шаблоном Null Object и может помочь удалить условные проверки в вашем коде

https://laravel.com/docs/5.7/eloquent-relationships#inserting-and-updating-related-models

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...