尝试使用模型关系获取非对象的属性

时间:2016-10-29 18:47:40

标签: php laravel

我正在尝试在laravel模板中获取模型之间的关系。 我想将产品字段与广告相对应。

这是我的AdController:

public function ads(Request $request)
    {
        $this->adRepository->pushCriteria(new RequestCriteria($request));     
        $hash = Auth::user()->environment_hash;
        $ads = $this->adRepository->findByHash($hash);
        return view('ads.index')
            ->with('ads', $ads);
    }

这是我如何解析我的刀片模板:

@foreach($ads as $ad)
            <tr>
                <td>{!! $ad->product->name !!}</td>
            </tr>
@endforeach

但我一直收到这个错误:

Trying to get property of non-object

这是adRepository文件:

public function findByHash($hash = null)
    {
        $model = $this->model;

        if($hash)
            $this->model->where('environment_hash',  $hash);
        else
            $this->model->where('environment_hash',  Auth::user()->environment_hash);

        return $model;
    }

这是我的广告模型:Ad.php

<?php

namespace App\Models;

use Eloquent as Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Ad extends Model
{

    public function product()
    {
        return $this->belongsTo(Product::class);
    }
}

这是我的广告表:

id
product_id
environment_hash

我的产品表:

id
environment_hash
name

代码有什么问题?

1 个答案:

答案 0 :(得分:1)

不确定,但必须有一些广告在您的数据库中没有产品。所以这可能是你得到错误的原因。确保您的所有广告都在数据库中包含相关产品。

您可以通过运行以下代码来测试它:

 @foreach($ads as $ad) <tr> <td>Test  {!! $ad->product !!}</td> </tr> @endforeach

如果你得到这样的结果:

  Test some_name
  Test
  Test some_another_name

然后确认某些广告没有相关产品。

如果是这种情况,则需要在访问产品属性之前进行if()检查。

<强>更新

问题是您get()中遗失了findByHash()。 它应该是:

public function findByHash($hash = null)
{
    $model = $this->model;

    if($hash)
        $this->model->where('environment_hash',  $hash);
    else
        $this->model->where('environment_hash',  Auth::user()->environment_hash);

    return $model->get();
}