Неудачный ресурс Laravel Nova много ко многим - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть два ресурса, Кирпичи и Стены.

Модель Brick определяется как

class Brick extends Model
{
    public function walls()
    {
        return $this->belongsToMany('App\Wall')->withTimestamps();
    }
}

и модель Wall определяется как

class Wall extends Model
{
    public function bricks()
    {
        return $this->hasMany('App\Brick');
    }
}

Идея состоит в том, что стена может иметь много кирпичей, а кирпич может принадлежать многим стенам.

В Nova у меня есть поля Wall, настроенные как

public function fields(Request $request)
{
    return [
        ID::make()->sortable(),
        Text::make('Name'),
        HasMany::make('Bricks')
    ];
}

и поля Brick, установленные как

public function fields(Request $request)
    {
        return [
            ID::make()->sortable(),
            Text::make('Name'),
            BelongsToMany::make('Walls')
        ];
    }

При попытке прикрепить кирпич к стене через ресурс кирпича я получаю ошибку SQLSTATE[HY000]: General error: 1 no such table: main.wall_id (SQL: insert into "brick_wall" ("brick_id", "wall_id", "created_at", "updated_at") values (5, 1, 2018-11-18 22:08:23, 2018-11-18 22:08:23)), а при попытке добавить кирпич к стене через ресурс стены я получаю SQLSTATE[HY000]: General error: 1 no such column: bricks.wall_id (SQL: select * from "bricks" where "bricks"."wall_id" = 1 and "bricks"."wall_id" is not null)

Я пытался переключить отношения belongsToMany и hasMany, но это не помогает.


Редактировать: вот схема для промежуточной таблицы

Schema::create('brick_wall', function (Blueprint $table) {
            $table->increments('id');

            $table->integer('brick_id')->unsigned();
            $table->integer('wall_id')->unsigned();

            $table->foreign('brick_id')->references('id')->on('brick_id');
            $table->foreign('wall_id')->references('id')->on('wall_id');
        });

1 Ответ

0 голосов
/ 19 ноября 2018

Для связи многих со многими необходимо иметь промежуточную таблицу, например, brick_wall в вашей базе данных mysql, чтобы установить связь между многими и многими brick таблицей и wall таблицей. Он содержит столбцы brick_id и wall_id и имеет отношение внешнего ключа к таблице brick и таблице wall.

Чтобы определить отношение многие ко многим, обе модели используют функцию belongsToMany от Eloquent. Он найдет связь между brick и wall таблицей с {tableName}_id в качестве имени столбца по умолчанию в качестве первичного ключа и внешнего.

Если вы используете нестандартное красноречивое имя в качестве первичного ключа и внешнего ключа, вы можете обратиться к официальной документации eloquent laravel https://laravel.com/docs/5.7/eloquent-relationships#many-to-many

...