Laravel 5.1 - 具有空值的模型上的关系
Posted
技术标签:
【中文标题】Laravel 5.1 - 具有空值的模型上的关系【英文标题】:Laravel 5.1 - Relationships on model with null values 【发布时间】:2016-04-17 15:10:45 【问题描述】:我在 Laravel 5.1 上使用空值的模型上的关系有问题。
我有 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。
如何解决这个问题以显示所有寄存器?
谢谢!!!
【问题讨论】:
【参考方案1】:代替:
@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
都可能为空(没有相关记录),因此您不能在null
上使用名称属性(->name
)
【讨论】:
【参考方案2】:首先,让我们谈谈显示条件数据。
来自文档: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>
只有存在时才会显示适当的数据。如果没有,它将显示“Nobody responsibility”或“No requester”。
但是,如果您的问题是如何获取只有某人负责的任务,您可以更改查询以使用 has
方法:
$tasks = Tasks::has('responsible')->get();
这只会检索已经分配了“负责”人员的任务,因此您不必担心空值。
【讨论】:
以上是关于Laravel 5.1 - 具有空值的模型上的关系的主要内容,如果未能解决你的问题,请参考以下文章
在 laravel 中具有雄辩关系的更新期间从空值创建默认对象
laravel-如何在 5.1 中使用 zizaco 获得具有所有角色和所有权限的用户?