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-&gt;requester$task-&gt;responsible 都可能为空(没有相关记录),因此您不能在null 上使用名称属性(-&gt;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 多对多标签不起作用

laravel-如何在 5.1 中使用 zizaco 获得具有所有角色和所有权限的用户?

Laravel 5.1 删除关系

Laravel 5.1 中 3 个模型之间的关系(“像多对多通过”)

Fluent Assertion - 比较忽略空值的模型属性