Laravel Many to Many дает неожиданные значения - PullRequest
0 голосов
/ 13 марта 2019

В проекте 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
Создатель комплекта: Гален

  • 403
  • 404
  • 405

  • 3


Но то, что я на самом деле получаю, это:

Идентификатор комплекта: 2
Количество групп комплектов: 0
Количество элементов комплекта: 1
Создатель комплекта: Гален

  • 2

Вот модель 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.

Я не могу думать ни о чем другом, что я пропускаю. Может, кто-то еще это видит?

...