【问题标题】:Trying to get property of non-object Laravel 5.2试图获取非对象 Laravel 5.2 的属性
【发布时间】:2016-03-20 17:58:19
【问题描述】:

我不断收到此错误尝试获取非对象的属性。

这是我的控制器

public function onGoingOrder($orderNumber)
{
    $orderNumber = westcoorder::where('id', $orderNumber)->firstOrFail();

    $items = westcoorderitem::where('westcoorder_id', $orderNumber)->first();

    return view('westco.onGoingOrder', compact('orderNumber', 'items'));
}

这就是我的看法

<div class="panel-heading">Order {{ $orderNumber->id }} Items</div>
        <div class="panel-body">
            @foreach ($items->westcoorderitems as $item)
                <li>{{ $item }}</li>
            @endforeach

        </div>
    </div>

这是我的两个模型

class westcoorder extends Model
{
    protected $table = 'westcoorders';
    protected $with = 'westcoorderitems';

    protected $fillable = ['is_sent', 'is_delivered'];

/**
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
    public function westcoorderitems()
    {
        return $this->hasMany('App\westcoorderitem');
    }
}

class westcoorderitem extends Model
{
    protected $table = 'westcoorderitems';

    protected $fillable = ['westcoorder_id','quantity', 'productName', 'productCode', 'price'];


    public function westcoorders()
    {
        return $this->belongsTo('App\westcoorder');
    }
}

当我尝试使用 Order_id 列出订单中的所有商品时,我不断收到该错误

这是我的桌子的样子

Schema::create('westcoorders', function (Blueprint $table)
{
        $table->increments('id');
        $table->tinyInteger('is_sent')->default(0);
        $table->tinyInteger('is_delivered')->default(0);
        $table->timestamps();
} );

Schema::create('westcoorderitems', function (Blueprint $table)
{
        $table->increments('id');
        $table->Integer('westcoorder_id'); // fk for westcoOrder.id
        $table->string('quantity');
        $table->string('productName');
        $table->string('productCode');
        $table->decimal('price');
        $table->timestamps();
} );

【问题讨论】:

标签: mysql laravel laravel-5 laravel-5.2


【解决方案1】:

在 Laravel 的最后一个版本中,很多事情都发生了变化。版本 >= 5 时,模型不会自动加载到您的应用程序中。在您的控制器中,在命名空间 {yournamespace} 下;语句,使用 use 语句引用你需要的类:

use App\westcoorders

只是关于约定的建议:尊重约定始终是一种良好的做法。您的模型应该称为 WestCoorder 和 WestCoorderItem(注意类的 CamelCase 命名)。这个概念也适用于您的控制器(WestCoordersController 和 WestCoorderItemsController)

【讨论】:

  • 我的控制器中已经有了这个use App\westcoorder;,但我仍然收到错误
  • 我也开始使用 CamelCase 所以我应该像这样 WestcoOrderItemsWestcoOrder
【解决方案2】:

首先,你应该在使用之前检查$orderNumber是否存在:

@if ($orderNumber)
    {{ $orderNumber->id }}
@endif

接下来,您尝试迭代 $items-&gt;westcoorderitems,但是:

  • 它不是一个集合,因为您使用的是 first() 方法。它返回一个实例,因此您不应对其进行迭代。
  • 我在您的westcoorderitems 表中看不到westcoorderitems 列,因此您不应尝试在此处使用$items-&gt;westcoorderitems
  • 在使用之前,您还应该检查$items 是否为空。

因此,您的代码应如下所示:

<div class="panel-heading">Order @if ($orderNumber) {{ $orderNumber->id }} @endif Items</div>
    <div class="panel-body">
        @if ($items)
            {{ $items->productName }}
        @endif
    </div>
</div>

【讨论】:

  • 我确实有过这样的情况,但我得到了这个错误Undefined property: Illuminate\Database\Eloquent\Builder::$productName,我仍然是??
  • 这意味着您的查询不会返回任何结果。尝试在{{ $items-&gt;productName }} 之前使用dd($items) 以了解是否有productName
  • 所以我不会返回任何结果。这意味着两个数据库之间的关系不起作用
猜你喜欢
  • 2016-12-23
  • 2018-01-15
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 2015-09-22
相关资源
最近更新 更多