Eloquent多对多attach()传递空模型ID

时间:2018-06-09 12:20:16

标签: php mysql laravel laravel-5 eloquent

我正在使用Laravel和Eloquent ORM开发一个应用程序,它使用一个充满事件信息的数据库。

我已在我的用户和角色模型的相关控制器中成功实施了attach()

我的活动模型可以有很多链接。链接可以有很多事件。 我的问题是attach()没有提供它被调用的对象的ID,而是提供null,我收到以下错误消息:

  

SQLSTATE [23000]:违反完整性约束:

     

1048栏'link_id'   不能为null(SQL:插入'event_link'('created_at','event_id',   'link_id','updated_at')值(2018-06-09 11:27:15,2,201-06-09 11:27:15))

我已经检查了我的模型和数据库结构。

我甚至无法想象如何发生此错误,因为SQL查询中缺少的id是实际调用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 :(得分:0)

问题是public $incrementing = false;:从两个模型中删除该行。

您的id列定义为AUTO_INCREMENT,因此$incrementing必须为true