Laravel Eloquent 多对多,增量依赖

Posted

技术标签:

【中文标题】Laravel Eloquent 多对多,增量依赖【英文标题】:Laravel Eloquent many to many with increment which is dependent 【发布时间】:2021-12-21 10:01:11 【问题描述】:

我有一个客户模型和一个具有多对多关系的位置模型 (Postgres)。 现在我还需要一个增量编号,它是某个位置内客户的 ID。

示例customers_locations 表: 等等。

所以customer_location_internal_number 应该告诉某个位置内客户的 ID。当我将客户添加到某个位置时,它应该将该数字增加 1。

有没有办法在一个表中执行此操作,还是我需要另一个查找表?

迁移看起来像这样:

    public function up()

    Schema::create('customers_locations', function (Blueprint $table) 
        $table->id();
        $table->bigInteger('customer_id');
        $table->bigInteger('location_id');
        $table->bigInteger('customer_location_internal_number');
        $table->timestamps();

        $table->foreign('customer_id')
            ->references('id')
            ->on('customers')
            ->onUpdate('cascade')
            ->onDelete('cascade');

        $table->foreign('location_id')
            ->references('id')
            ->on('locations')
            ->onUpdate('cascade')
            ->onDelete('cascade');
    );

【问题讨论】:

你用这个customer_location_internal_number做什么?由于id 存在并且自动递增,所以这个额外的自动递增(或手动递增)列是否真的有用?您可以从以下ids 中为location_id: 1 推断出类似的信息:1, 3, 4, 6 与列将包含的内容,即1, 2, 3, 4(请注意,每个都大于上一个,只是在idcustomer_location_internal_number 没有空白) 是的,它确实是有目的的。我们需要它作为多租户应用程序的内部标识符。 【参考方案1】:

您可以使用newPivotQuery 来执行此操作,此方法为数据透视表创建一个新的查询生成器。

例如:

$location=getLocation();
$customer=getCustomer();

$location->users()->sync([$user->id]);
$location->users()->newPivotQuery()->where('customer_id',$customer->id)
->where('location_id',$location->id)->increment('customer_location_internal_number');

【讨论】:

以上是关于Laravel Eloquent 多对多,增量依赖的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 多对多 [编辑]

查询 Laravel Eloquent 多对多,其中所有 id 都相等

Laravel (8.x) 这个多对多过滤问题有更好的 Eloquent 查询吗?

Laravel Eloquent 三个模型之间的多对多关系

与多个中间表的多对多 Laravel Eloquent 关系

Laravel Eloquent 根据数据透视表字段条件获取多对多关系