Я разрабатываю приложение с использованием 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_Link:
Ниже приводитсяпроблемный метод в контроллере, ответственный за хранение записи и создание записи в слабом объекте 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');
}
}