2016-01-12 4 views
0

У меня проблема с отношениями с моделью с нулевыми значениями на Laravel 5.1.Laravel 5.1 - Отношения по модели с нулевыми значениями

У меня есть 2 таблицы Задачи и пользователи. В задачах у меня есть столбец id_requester и id_responsible.

Я хочу показать все задачи, у меня всегда есть запросчик, но иногда я еще не несу ответственность.

Таким образом, id_responsible имеет значение null в этом случае.

Моя Модель:

protected $table = 'tasks'; 

protected $fillable = array(
      'id_requester', 
      'id_responsible', 
     ); 

public function requester() 
    { 
     return $this->hasOne('app\User', 'id', 'id_requester'); 
    } 

public function responsible() 
    { 
     return $this->hasOne('app\User', 'id', 'id_responsible'); 
    } 

Запрос в моем контроллере:

$tasks = Tasks::get(); 

Я пытаюсь показать в виду, как это:

<table> 
... 
@foreach($tasks as $task) 
    <td>{{ $task->requester->name }}</td> 

    <td>{{ $task->responsible->name }}</td> 
@endforeach 
... 
</table> 

Проблема заключается в том что при попытке доступа к странице я получаю сообщение об ошибке «Попытка получить свойство не-объекта».

Я уже тестирую, и это только когда у меня есть id_responsible = Null.

Как я могу исправить это, чтобы показать все регистры?

Спасибо !!!

ответ

3

Во-первых, давайте поговорим о отображении условных данных.

Из документов: https://laravel.com/docs/5.2/blade#displaying-data

Иногда вы можете повторить переменную, но вы не уверены, если переменная была установлена. Мы можем выразить это в расширенном коде PHP как так:

{{ isset($name) ? $name : 'Default' }}

Однако, вместо того, чтобы писать трехкомпонентную заявление, Blade предоставляет следующие удобные укороченные:

{{ $name or 'Default' }}

В этот пример, если существует переменная $ name, будет отображаться ее значение. Однако, если он не существует, будет отображаться слово Default.

Другими словами, вы должны быть в состоянии сделать это:

<td>{{ $task->requester->name or 'No requester' }}</td> 

<td>{{ $task->responsible->name or 'Nobody responsible.' }}</td> 

Это будет отображать соответствующие данные, только если он существует. В противном случае отобразится либо «Никто не отвечает», либо «Нет реквестера».

Однако, если ваш вопрос заключается в том, чтобы задачи, которые имеют только кого-то ответственность, вы можете изменить запрос, чтобы использовать has метод:

$tasks = Tasks::has('responsible')->get(); 

Это будет только восстановить задачи, которые есть «ответственный» лицо уже назначено так, что вам не нужно беспокоиться о нулевых значениях.

+0

Большое вам спасибо !!! –

0

Вместо:

@foreach($tasks as $task) 
    <td>{{ $task->requester->name }}</td> 

    <td>{{ $task->responsible->name }}</td> 
@endforeach 

вы должны использовать:

@foreach($tasks as $task) 
    <td>{{ $task->requester ? $task->requester->name : 'unknown' }}</td> 

    <td>{{ $task->responsible ? $task->responsible->name : 'unknown' }}</td> 
@endforeach 

Это происходит потому, что как $task->requester и $task->responsible могут быть пустыми (нет связанных записей), поэтому вы не можете использовать имя свойства (->name) на null

+0

Спасибо вам большое! –