Используя странные имена для столбцов, вы теряете много того, что Laravel обычно делает автоматически. Но, как указано в документации , вы можете "переопределить внешний и локальный ключи, передав дополнительные аргументы методу hasMany."
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Box extends Model {
protected $guarded = [];
protected $primaryKey = 'box_barcode';
public $incrementing = false;
protected $keyType = 'string';
public function items() {
return $this->hasMany(Item::class, 'its_box_barcode', 'box_barcode');
}
}
Вам также необходимо определить обратную связь между элементы и ящики, опять же используя ваши нестандартные имена столбцов.
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Item extends Model {
protected $primaryKey = 'item_barcode'; // or null
public $incrementing = false;
protected $keyType = 'string';
public function box() {
return $this->belongsTo(Box::class, 'its_box_barcode', 'box_barcode');
}
}
Мы бы посоветовали придерживаться ожидаемого соглашения об именах платформы, чтобы избежать многих проблем. то есть boxes.box_barcode
должно быть boxes.barcode
, items.item_barcode
должно быть items.barcode
, а items.its_box_barcode
должно быть items.box_id
, указывая на стандартный числовой столбец c, называемый id
. Да, это немного расточительно, если у вас уже есть другое уникальное значение в базе данных, но вы будете бороться с соглашением, если вы поступите иначе. Поэтому мой предложенный код модели был бы очень прост:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Box extends Model {
public function items() {
return $this->hasMany(Item::class);
}
}
class Item extends Model {
public function box() {
return $this->belongsTo(Box::class);
}
}
Вы должны также определить эти отношения на уровне базы данных, используя ограничения внешнего ключа в ваших миграциях:
Schema::create('boxes', function (Blueprint $table) {
$table->bigIncrements('id')->primary();
$table->string('barcode');
$table->string('sort_description');
$table->timestamps();
});
Schema::create('items', function (Blueprint $table) {
$table->bigIncrements('id')->primary();
$table->string('box_id');
$table->string('barcode');
$table->string('quality');
$table->timestamps();
$table->foreign('box_id')->references('id')->on('boxes')->onDelete('cascade');
});
Теперь в вашем шаблоне вы можете ссылаться на такие вещи:
@foreach ($boxes as $box)
{{ $box->barcode }}
@foreach ($box->items as $item)
{{ $item->barcode }}
@endforeach
@endforeach