Я пытаюсь заставить iot показывать элементы в пределах заказа, и я продолжаю получать эту ошибку
Это мои модели
class westcoorder extends Model { protected $table = 'westcoorders'; protected $with = 'westcoorderitem'; protected $fillable = ['is_sent', 'is_delivered']; /** * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function westcoorderitem() { return $this->hasMany('App\westcoorderitem'); } } class westcoorderitem extends Model { protected $table = 'westcoorderitems'; protected $fillable = ['westcoorder_id','quantity', 'productName', 'productCode', 'price']; public function westcoorder() { return $this->belongsTo('App\westcoorder'); } }
Это мой контроллер
public function onGoingOrder($orderNumber) { $orderNumber = westcoorder::where('id', $orderNumber)->firstOrFail(); $items = westcoorderitem::where('westcoorder_id', $orderNumber)->get(); return view('westco.onGoingOrder', compact('orderNumber', 'items')); }
И это то, что у меня есть на мой взгляд
<div class="panel-heading">Order @if ($orderNumber) {{ $orderNumber->id }} @endif Items</div> <div class="panel-body"> @if($items) {{ $items->productName }} @endif </div>
Вот как выглядят мои таблицы
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(); } );
по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(); } );
по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(); } );
И это ошибка, которую я получаю
Undefined property: Illuminate\Database\Eloquent\Collection::$productName
Как и ваша ошибка:
Неопределенное свойство: Illuminate \ Database \ Eloquent \ Collection :: $ productName
Вы пытаетесь получить доступ к свойству в коллекции вместо модели. Во-первых, вы можете использовать созданные вами отношения, например:
$order = App\westcoorder::where('id', $orderNumber)->with('westcoorderitem')->firstOrFail();
Это обеспечит включение элементов заказа в результат, а не выполнение другого запроса для их получения.
Затем вы можете перейти к $order
к представлению:
return view('welcome', compact('orderNumber', 'order'));
(Вероятно, вы можете просто оставить номер заказа, который был фактическим заказом, также)
Затем вы можете получить доступ к order
в своем представлении и выполнить цикл через такие items
:
@foreach($order->westcoorderitem as $item) {{ $item->productName }} @endforeach
Еще один совет может состоять в том, чтобы обновить таблицу, чтобы использовать индексы для повышения производительности и сделать ее аккуратной, например, FK
вы упомянули в комментарии о своей миграции. Вы можете выполнить миграцию, чтобы обновить его, например:
$table->foreign('westcoorder_id')->references('id')->on('westcoorders');
И / или расширьте это, в соответствии с вашими потребностями (каскадом и т. Д.).