В проекте Laravel у меня есть то, что я думал, что будет двумя простыми отношениями Eloquent многие-ко-многим между моделью с именем Kit и двумя другими моделями, Group и Item.
В базе данных все выглядит правильно, но когда я пытаюсь получить доступ к отношениям, я получаю некоторые очень неожиданные результаты.
Вот как выглядят сводные таблицы (я экспортировал таблицы MySQL в виде массивов PHP, чтобы их было легче просматривать здесь).
$group_kit = array(
array('group_no' => '401','kit_id' => '1'),
array('group_no' => '403','kit_id' => '1'),
array('group_no' => '404','kit_id' => '1'),
array('group_no' => '405','kit_id' => '1'),
array('group_no' => '401','kit_id' => '2'),
array('group_no' => '403','kit_id' => '2'),
array('group_no' => '404','kit_id' => '2'),
array('group_no' => '405','kit_id' => '2')
);
и
$item_kit = array(
array('item_no' => '3','kit_id' => '1'),
array('item_no' => '3','kit_id' => '2')
);
В моей базе данных в PHPMyAdmin все отношения есть. Например, если я нажму 3
в столбце item_no
сводной таблицы item_kit
, я перейду к экземпляру Item
в таблице items
, для которого item_no
равно 3.
Однако в моем шаблоне блейда этот код не показывает мне то, что я ожидаю увидеть:
<p>Kit ID: {{ $kit->id }}</p>
<p>Kit Groups Count: {{ $kit->groups->count() }}</p>
<p>Kit Items Count: {{ $kit->items->count() }}</p>
<p>Kit Creator: {{ $kit->user->first_name }}</p>
<ul>
@foreach($kit->groups as $group)
<li>Item: {{ $group->group_no }}</li>
@endforeach
</ul>
<ul>
@foreach($kit->items as $item)
<li>Item: {{ $item->item_no }}</li>
@endforeach
</ul>
Я ожидаю что-то вроде:
Идентификатор комплекта: 2
Количество групп комплекта: 4
Количество предметов комплекта: 1
Создатель комплекта: Гален
Но то, что я на самом деле получаю, это:
Идентификатор комплекта: 2
Количество групп комплектов: 0
Количество элементов комплекта: 1
Создатель комплекта: Гален
Вот модель Kit - подходящими функциями являются группы () и items ():
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Kit extends Model
{
protected $guarded = [];
public function organization()
{
return $this->belongsTo(Organization::class);
}
public function groups()
{
return $this->belongsToMany(Group::class, 'group_kit', 'kit_id', 'group_no');
}
public function items()
{
return $this->belongsToMany(Item::class, 'item_kit', 'kit_id', 'item_no');
}
public function notes()
{
return $this->hasMany(Note::class);
}
public function event()
{
return $this->belongsTo(Event::class);
}
public function user()
{
return $this->belongsTo(User::class);
}
}
Вот модель группы - подходящей функцией является kits ():
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Group extends Model
{
protected $guarded = [];
public function getRouteKeyName()
{
return 'group_no';
}
public function items()
{
return $this->hasMany(Item::class, 'group_no', 'group_no');
}
public function parent()
{
return $this->belongsTo(Group::class, 'parent_group', 'group_no');
}
public function children()
{
return $this->hasMany(Group::class, 'parent_group', 'group_no');
}
public function kits()
{
return $this->belongsToMany(Kit::class, 'group_kit', 'group_no', 'kit_id');
}
public function notes()
{
return $this->hasMany(Note::class, 'group_no', 'group_no');
}
}
А вот модель Item - подходящей функцией являются наборы ():
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Item extends Model
{
protected $guarded = [];
public function getRouteKeyName()
{
return 'item_no';
}
public function group()
{
return $this->belongsTo(Group::class, 'group_no', 'group_no');
}
public function kits()
{
return $this->belongsToMany(Kit::class, 'item_kit', 'item_no', 'kit_id');
}
public function notes()
{
return $this->hasMany(Note::class, 'item_no', 'item_no');
}
}
Вот схема для таблицы group_kit:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateGroupKitTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('group_kit', function (Blueprint $table) {
$table->unsignedInteger('group_no');
$table->unsignedInteger('kit_id');
$table->foreign('group_no')->references('group_no')->on('groups')->onDelete('cascade');
$table->foreign('kit_id')->references('id')->on('kits')->onDelete('cascade');
$table->primary(['group_no', 'kit_id']);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('group_kit');
}
}
А вот схема для таблицы item_kit:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateItemKitTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('item_kit', function (Blueprint $table) {
$table->unsignedInteger('item_no');
$table->unsignedInteger('kit_id');
$table->foreign('item_no')->references('item_no')->on('items')->onDelete('cascade');
$table->foreign('kit_id')->references('id')->on('kits')->onDelete('cascade');
$table->primary(['item_no', 'kit_id']);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('item_kit');
}
}
И столбец group_no
в таблице groups
, и столбец item_no
в таблице items
имеют тип unsignedInteger.
Я не могу думать ни о чем другом, что я пропускаю. Может, кто-то еще это видит?