Laravel属性[title]在此集合实例上不存在

时间:2018-07-21 07:46:25

标签: laravel

我正在尝试从3rd表中收集我的产品的数据,我得到了

Property [title] does not exist on this collection instance.

LOGIC

  1. custom_product_specifications表获得product_idspecification_idtext_declongtext_dec
  2. 如果用户访问的产品的ID在custom_product_specifications中,我将根据其ID显示specification title
  3. 我将显示text_declongtext_dec的数据

代码

CustomProductSpecification Model

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class CustomProductSpecification extends Model
{
    public $timestamps = false;

    protected $fillable = [
      'product_id', 'specification_id', 'text_dec', 'longtext_dec',
    ];

    public function products(){
        return $this->belongsToMany(Product::class);
    }

    public function specifications(){
        return $this->belongsToMany(Specification::class,'custom_product_specifications', 'specification_id');
    }
}

Product Model

    public function customsubspecifications(){
         return $this->belongsToMany(CustomProductSpecification::class, 'custom_product_specifications', 'product_id', 'specification_id');
      }

public function specifications(){
     return $this->belongsToMany(Specification::class);
  }

Specification Model

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Specification extends Model
{
  protected $fillable = [
      'title',
  ];

  public function subspecifications(){
     return $this->hasMany(Subspecification::class);
  }

  public function sets(){
     return $this->belongsToMany(Set::class);
  }

  public function customproductspecifications(){
     return $this->belongsToMany(CustomProductSpecification::class);
  }


}

这是我如何在视图中获取数据

controller

$product = Product::where('slug', $productslug)->firstOrFail();
$customspecs = CustomProductSpecification::where('product_id', '=', $product->id)->get();

blade

@if(!empty($customspecs))
  @foreach($customspecs as $customspec)
    <tr>
      <th style="width:150px;">{{ $customspec->specifications->title }}</th>
       <th class="text-left">
        {{$customspec->text_dec}}
        {{$customspec->longtext_dec}}
      </th>
    </tr>
  @endforeach
@endif

结果

如果我使用{{ $customspec->specifications->title }},我会得到错误消息。

如果我使用{{ $customspec->specifications}},这就是我得到的:

screenone

我的一个数据具有规范信息(重复),其他数据仅显示[]

更新

根据以下答案,我将blade代码更改为:

@if(!empty($customspecs))
          @foreach($customspecs as $customspec)
            @foreach($customspec->specifications as $specification)
              <tr>
                <th style="width:150px;">{{ $specification->title }}</th>
                <th class="text-left">
                  @isset($customspec->text_dec)
                  {{$customspec->text_dec}}
                  @endisset
                  @isset($customspec->longtext_dec)
                  {{$customspec->longtext_dec}}
                  @endisset
                </th>
              </tr>
            @endforeach
          @endforeach
        @endif

这里有2个问题:

  1. 我无法获取所有数据
  2. 它们不是内爆的(不在specificationsdetails中)

屏幕截图

my database

dbscreen

PS:它将仅加载我的上次输入id:4

Blade Results

bladescreen

PS:我的输入id:4重复了3次,而我应该获得的4结果有不同的信息。

2 个答案:

答案 0 :(得分:1)

您的CustomProductSpecificationSpecificationbelongs to many关系有关。您必须使用此代码

@if(!empty($customspecs))
  @foreach($customspecs as $customspec)
    <tr>
    @foreach($customspec->specifications as $specification)
      <th style="width:150px;">{{ $specification->title }}</th>
    @endforeach
      <th class="text-left">
        {{$customspec->text_dec}}
        {{$customspec->longtext_dec}}
      </th>
    </tr>
  @endforeach
@endif

答案 1 :(得分:0)

Laravel自动将您的查询结果从查询转换为集合,并尊重您的“ with”参数,并创建一个联接查询,以便为您提供您所请求的所有数据,但实际上是发生了一些情况,子表中的记录,因此laravel会假设它为null,并将您的Relation属性设为[]。在foreach循环中,当您尝试使用[]对象的属性时,会收到该错误。

如上所述,有很多方法可以解决此错误,但是我建议您了解为什么会发生此错误,以便您更好地了解laravel集合,关系以及如何将数据库表中的每个结果转换为您的方便。

方法#1

使用empty()函数检查该属性上是否存在该值,并且该值不为空。

方法2:

Laravel刀片有一个糖,您可以在这里找到:https://laravel-news.com/blade-or-operator

方法3 :(我不建议这样做)

在尝试访问该属性之前,请使用错误抑制操作符“ @”。

方法4 :(慢速方法并增加控制器和视图上的业务逻辑)

在使用控制语句将其发送到视图之前,在控制器中构造一个新数组。

方法5:

Laravel Blade作为@isset指令。您也可以使用它。更多详细信息here