【问题标题】:Laravel 5.1 - Relationships on model with null valuesLaravel 5.1 - 具有空值的模型上的关系
【发布时间】: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。

如何解决这个问题以显示所有寄存器?

谢谢!!!

【问题讨论】:

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


    【解决方案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();
      

      这只会检索已经分配了“负责”人员的任务,因此您不必担心空值。

      【讨论】:

        猜你喜欢
        • 2016-02-21
        • 1970-01-01
        • 2015-11-13
        • 1970-01-01
        • 1970-01-01
        • 2013-12-20
        • 2021-07-19
        • 2018-03-01
        相关资源
        最近更新 更多