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 【问题描述】:我有两个关系表,其中包含枢轴 routes
、stations
和 route_station
。 routes
表包含地铁的路线编号,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
错误。这是因为,我相信attach
和sync
只插入一条记录,而请求字段是一个数组。
那么如何为数组的每一项插入一条记录呢?
$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 个关系创建关系?