【问题标题】:Laravel Pivot table id columnLaravel 数据透视表 id 列
【发布时间】:2014-08-24 10:00:42
【问题描述】:

在 Laravel 和 Eloquent 中,您可以将 ManyToMany-Relations 与数据透视表一起使用。我的问题是数据透视行的自动 ID。我可以更改 ID 的生成方式吗?我想为此使用 UUID。

对于其他对象,您可以在模型中实现此行为,但没有用于枢轴对象的模型。

我错过了什么吗?

【问题讨论】:

    标签: laravel pivot eloquent uuid


    【解决方案1】:

    在这里要小心:在执行join 时,数据透视表上的id 可能会导致混淆,因为它最终会与连接表的id 位于同一行,并且可能会导致相当讨厌的错误,因为后者将覆盖前者。如果你真的需要一个,至少改变它的名字。

    【讨论】:

      【解决方案2】:

      我认为创建中间模型做得更好,否则我们必须在创建新记录时添加主 uuid。

      use Webpatser\Uuid\Uuid;
      use Illuminate\Database\Eloquent\Relations\Pivot;
      
      class ProjectAssignee extends Pivot
      {
      
          public $incrementing = false;
          protected $keyType = 'string';
          protected $primaryKey = 'id';
          protected $guarded = [];
      
          public static function boot()
          {
             parent::boot();
             self::creating(function ($model) {
                 $model->id = (string) Uuid::generate(4);
             });
          }
      
      }
      

      现在我们可以轻松创建附件了

      Project::first()->assignees()->attach(Assignee::inRandomOrder()->take(5)->pluck('id')->toArray());
      

      别忘了链接using方法来告诉中间表的关系。

      public function assignees(){return $this->belongsToMany(
        Assignee::class,
       'projects_assignees',
       'project_id',
       'assignee_id')
      ->using(ProjectAssignee::class);}
      

      【讨论】:

        【解决方案3】:

        是的,无论您通过attach()sync() 向数据透视表添加新记录的任何位置,您都可以为其提供一个包含附加项的键/值数组作为第二个参数放入数据透视表中。

        例如$user->roles()->attach($role, array('id' => $uuid));

        如果您这样做,还需要确保您的 id 未设置为自动递增。

        可能还需要注意的是,很多人的数据透视表上甚至没有 id 列,因为通常不需要它,除非您计划为其创建模型,或者它包含其他一些外来的出于某种原因,除了它通常具有的 2 之外的其他原因。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-05-17
          • 2018-04-10
          • 2021-02-06
          • 1970-01-01
          • 1970-01-01
          • 2017-12-15
          • 2021-08-17
          • 1970-01-01
          相关资源
          最近更新 更多