Laravel 在数据透视表中为克隆字段的一个关系 ID 插入多行

Posted

技术标签:

【中文标题】Laravel 在数据透视表中为克隆字段的一个关系 ID 插入多行【英文标题】:Laravel insert multiple row in pivot table for one relational id for clone fields 【发布时间】:2020-10-13 03:23:26 【问题描述】:

我有两个关系表,其中包含枢轴 routesstationsroute_stationroutes 表包含地铁的路线编号,stations 包含所有车站。

数据透视表多条路线和每条路线的多个站点。所以不知道如何考虑。 many-to-many 还是 one-to-many

html 表单

Route 上的 HTML 表单包含需要插入数据透视表的可克隆字段。见下文。

车站 下一站 距离 持续时间

问题

所以我的问题是如何插入可克隆字段数据(在上面 list) 以便在 pivot 表中为每个克隆字段插入行?

还有我如何更新,以便更新数据透视表中的确切记录 表,如果克隆字段被删除,那么数据透视表中的记录 表也​​删除了?

路由架构

Schema::create(
    'routes',
    function (Blueprint $table) 
        $table->bigIncrements('id');
        $table->smallInteger('number')->unsigned()->unique();
        $table->string('code')->unique();
        $table->timestamps();

        $table->unique(['number', 'code'], 'routes_unique_columns');
    
);

站架构

Schema::create(
    'stations',
    function (Blueprint $table) 
        $table->bigIncrements('id');
        $table->string('name')->index()->unique();
        $table->string('code')->index()->unique();
        $table->text('info');
        $table->string('photo')->nullable();
        $table->timestamps();
    
);

路由站(枢轴)架构

Schema::create(
    'route_station',
    function (Blueprint $table) 
        $table->bigIncrements('id');
        $table->bigInteger('route_id')->unsigned();
        $table->bigInteger('station_id')->unsigned();
        $table->bigInteger('next_station_id')->unsigned();
        $table->integer('station_order');
        $table->float('distance');
        $table->integer('duration');
        $table->timestamps();

        $table->unique(['route_id', 'station_id'], 'route_station_unique');

        $table->foreign('route_id')
              ->references('id')
              ->on('routes')
              ->onDelete('restrict');

        $table->foreign('station_id')
              ->references('id')
              ->on('stations')
              ->onDelete('restrict');

        $table->foreign('next_station_id')
              ->references('id')
              ->on('stations')
              ->onDelete('restrict');
    
);

路线创建/更新表格

更新

我在下面尝试过但没有工作。给出Array to String conversion 错误。这是因为,我相信attachsync 只插入一条记录,而请求字段是一个数组。

那么如何为数组的每一项插入一条记录呢?

$route = Route::create([
    'number' => $request->number,
    'code'   => strtoupper($request->code),
]);

$route->stations()->sync($route, [
    'next_station_id' => $request->next_station_id,
    'distance'        => $request->distance,
    'duration'        => $request->duration,
    'station_order'   => $request->station_order,
]);

【问题讨论】:

这里有一些可以帮助你的,只要选择正确的laravel版本laravel.com/docs/7.x/eloquent-relationships 【参考方案1】:

所以我可以看到,对于一个路段,您有一个起点站和一个终点站,因此您可以认为这是一对一的关系。

路由部分是指 route_station 表的一行。

一个路段 => 一个起点站,一个终点段。

第二路段 => 第二个起点站,第二个终点站。

您可以将每个 route_station.station_id 到stations.id 和route_station.next_station_id 到stations.id 一对一考虑

有了这个,您可以为每个 route_station 选择起点和下一站。 因此,在 route_station 表中,您可以将 station_id 字段与 station 表建立一对一关系,将 next_station_id 字段与 station 表建立一对一关系

另一方面,您有一条通往许多 route_stattions(许多路由部分)的路线,您可以将所有 route_stattions 用于一条路线。 因此,在路由表中,您可以在字段 routes.id 上与表 route_stations 和字段 route_stations.route_id 建立一对多关系

您可以在链接上阅读有关 laravel 关系的更多信息

https://laravel.com/docs/7.x/eloquent-relationships#one-to-many

确保选择正确的 laravel 版本

您可以为每个表逐个模型插入值。

您只需要确保为每条记录的 tge 外部字段获取正确的 id。

您也可以按模型单独更新数据模型,但您首先需要获取需要更新的表行ID。

您可以在此链接上阅读有关更新模型的更多信息 https://laravel.com/docs/7.x/eloquent#updates

【讨论】:

如果 ithis 解决了你的问题,你能在我的回答上签名作为这个问题的回答吗 感谢您的详细解释和参考链接。这对我有帮助。 请查看我的更新代码。我在插入多个字段记录时遇到问题。 我不认为你可以在这种情况下使用同步。 laravel.com/docs/7.x/eloquent-relationships。您可以像在上面的路由表中一样插入表中。 sync 只是一个尝试。 attach 也不起作用。我遵循了医生,但没有帮助我。我的问题可能不同。我想创建多个记录,从可克隆字段提交一个表单请求。但是,文档显示一次插入一条记录。

以上是关于Laravel 在数据透视表中为克隆字段的一个关系 ID 插入多行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 中使用数据透视表中的 3 个关系创建关系?

在 Laravel 的数据透视表中添加 id 列有啥好处?

在 laravel 的数据透视表中存储数据

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

laravel4 更新数据透视表中的附加列

Laravel 5.8 在数据透视表上保存一对多关系