Laravel 5.1 - 具有空值的模型的关系

时间:2016-01-12 20:31:19

标签: laravel laravel-5 eloquent laravel-5.1 blade

我在Laravel 5.1上使用null值的模型上的关系有问题。

我有2个表任务和用户。在任务中,我有列id_requester和id_responsible。

我想展示所有任务,我总是有一个请求者,但有时我还没有负责任。

因此,在这种情况下,id_responsible为空。

我的模特是:

 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。

如何修复此问题以显示所有寄存器?

感谢!!!

2 个答案:

答案 0 :(得分:4)

首先,我们来谈谈显示条件数据。

来自文档:https://laravel.com/docs/5.2/blade#displaying-data

  

有时您可能希望回显一个变量,但您不确定该变量是否已设置。我们可以用详细的PHP代码表达这一点:

     

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

     

然而,Blade并没有编写三元语句,而是为您提供以下方便的捷径:

     

{{ $name or 'Default' }}

     

在此示例中,如果$ name变量存在,则将显示其值。但是,如果它不存在,将显示“默认”一词。

换句话说,您应该可以这样做:

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

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

只有存在时才会显示相应的数据。如果没有,它将显示“无人负责”或“无请求者”。

但是,如果您的问题是如何获得只有某人负责的任务,您可以更改查询以使用has方法:

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

这将仅检索已经分配了“负责”人员的任务,这样您就不必担心空值。

答案 1 :(得分: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