Eloquent многие ко многим attach () передает нулевой идентификатор модели - PullRequest
0 голосов
/ 09 июня 2018

Я разрабатываю приложение с использованием Laravel и Eloquent ORM, оно использует базу данных, заполненную информацией о событиях.

Я успешно реализовал attach() в соответствующих контроллерах как для моих пользователей, так и для ролевых моделей.

Модель моего события может иметь много ссылок.Ссылка может иметь много событий.Моя проблема заключается в том, что attach() не предоставляет идентификатор объекта, к которому он вызывается, вместо этого он предоставляет пустое значение, и я получаю следующее сообщение об ошибке:

SQLSTATE [23000]: ограничение целостностинарушение:

1048 Столбец 'link_id' не может быть нулевым (SQL: вставить в значения 'event_link' ('creation_at', 'event_id', 'link_id', 'updated_at') (2018-06-09 11:27:15, 2,, 2018-06-09 11:27:15))

Я трижды проверил свои модели и структуру базы данных.

Я даже не могупредставьте себе, как эта ошибка может произойти, поскольку в запросе SQL отсутствует идентификатор id объекта, к которому фактически вызывается метод attach().Если я использую sync($eventID, false) вместо attach(), результат будет таким же.

Таблица событий:

Event table

Таблица ссылок:

Link table

Таблица Event_Link:

Event_Link table

Ниже приводитсяпроблемный метод в контроллере, ответственный за хранение записи и создание записи в слабом объекте event_link.

Объект $link создается успешно, если строка attach() закомментирована, JSON-представлениевозвращается ссылка, подтверждающая это (но в ней отсутствует поле 'id').

    public function store(StoreLink $request) {
      $link = Link::create([
        'title' => $request->title,
        'url' => $request->url,
      ]);

      if ($request['eventId']) {
        // $request->eventId is passed successfully, $link id is not passed.
        $link->events()->attach($request->eventId);
      }
      return response()->json($link, 201);
    }

Модель связи:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Link extends Model
{
  protected $table = 'links';
  public $incrementing = false;
  public $timestamps = true;
  protected $primaryKey = "id";
  protected $fillable = ['title', 'url'];

  public function events()
  {
    return $this->belongsToMany('App\Event')->withTimestamps();
  }
}

Модель события:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Event extends Model
{
  protected $table = 'events';
  public $incrementing = false;
  public $timestamps = true;
  protected $primaryKey = "id";
  protected $fillable = ['description', 'date', 'image', 'category_id'];

  public function category()
  {
      return $this->belongsTo('App\Event', 'category_id');
  }

  public function links()
  {
    return $this->belongsToMany('App\Link', 'event_link')->withTimestamps();
  }

  public function history()
  {
    return $this->belongsToMany('App\User', 'user_history');
  }

  public function favourites()
  {
    return $this->belongsToMany('App\User', 'user_favourites');
  }

}

1 Ответ

0 голосов
/ 09 июня 2018

Проблема в public $incrementing = false;: удалите строку из обеих ваших моделей.

Ваши столбцы id определены как AUTO_INCREMENT, поэтому $incrementing должно быть true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...