试图获取非对象Laravel 5,4的属性

时间:2018-07-24 02:57:49

标签: php laravel laravel-5.4

我是Laravel新手。我只想问一下我的代码是否正确。我想通过Collection文件夹中index.blade.php中的某个分配来显示区域的楼层和建筑物的名称。集合属于工作分配,工作分配属于区域。

我在Collection index.blade.php中的代码

@foreach ($collections as $collection)
  <tr>    
     <td>
         {{ $collection->assignment->area['floor'] }} Floor
         {{ $collection->assignment->area['building'] }}
     </td> 
  <tr>
@endforeach

该代码生成错误“尝试获取非对象的属性”。所以我想问正确的显示方式。

这是模特

Collection.php

public function assignment()
{
    return $this->belongsTo(Assignment::class);
}

Assignment.php

public function collections()
{
    return $this->hasMany(Collection::class);
}
public function area()
{
    return $this->belongsTo(Area::class);
}

Area.php

public function assignments()
{
    return $this->hasMany(Assignment::class);
}

CollectionsController.php

public function index() //shows the table of the collections
{
    $collections = Collection::all();
    $disposals = Disposal::all();
    return view('collections.index', compact('collections', 'disposals'));
}

4 个答案:

答案 0 :(得分:1)

  

“更新”:问题来自未封闭的tr标记,您像这样<tr><tr>打开了它,但应该是<tr></tr>:D就是这样,检查解决方案并告诉我是否可行。但是从好的方面来看,您的代码现在更加简洁实用:D

链接不好:),请尝试创建一个可以获取您所在区域的函数,否则...

或者您可以使用withDefault并返回相关模型的新实例

此外,您的数据库方案应如下所示:

收藏集

  • id
  • assignment_id

分配

  • id
  • area_id

laravel withDefault doc

但对于您的示例,我可以做:

Collection.php

public function assignment()
{
    return $this->belongsTo(Assignment::class)
        ->withDefault();
}

Assignment.php

public function collections()
{
    return $this->hasMany(Collection::class);
}
public function area()
{
    return $this->belongsTo(Area::class)
        ->withDefault();
}

Area.php

public function assignments()
{
    return $this->hasMany(Assignment::class);
}

CollectionsController.php

public function index() //shows the table of the collections
{
    $collections = Collection::all();
    $disposals = Disposal::all();
    return view('collections.index', compact('collections', 'disposals'));
}

也用于用途:

@foreach ($collections as $collection)
  <tr>    
     <td>
         {{ $collection->assignment->area->floor }} Floor
         {{ $collection->assignment->area->building }}
     </td> 
  <tr/>
@endforeach

如果一切正常,但仍然没有结果,请检查数据本身是否存在,因此请检查集合中是否有任何赋值,或者是否有返回赋值的区域...

答案 1 :(得分:0)

您应该使用这样的区域

$collection->assignment()->area()->building

答案 2 :(得分:0)

以下内容的几乎任何部分都可能返回Object[] pdus = (Object[]) bundle.get("pdus"); message = new SmsMessage[pdus.length]; for(int i =0 ; i < message.length ; i++){ message[i] = SmsMessage.createFromPdu( (byte[]) pdus[i] ); messageAddress = message[i].getOriginatingAddress(); messageBody = message[i].getMessageBody().toString(); }

null

如果该特定Collection不存在从Collection到Assignment的关系,则将为其返回$collection->assignment->area 。 这将适用于所有null关系。

您将需要检查这些内容,弄清楚如何在singular的情况下返回一些默认值,或者确保该关系始终存在于数据库中。

答案 3 :(得分:0)

可能会出现错误,因为所有记录都没有将数据连接到子表中,以免发生错误。要克服错误,您可以使用optional()方法。

方法将自动处理null关系。

optional($collection->assignment)->area

有关更多信息,您可以检查此link 祝你好运