繁体   English   中英

具有多列的 Laravel 数据透视表需要稍后插入

[英]Laravel pivot table with multiple columns that needs to insert later

我有两张桌子routesstations和一张数据透视表route_station 查看表格详情

路由表

id, number, code

车站表

id, name, code

route_station 表(枢轴)

id, route_id, station_id, next_station_id, interchange_station_id, sation_order, distance, duration

station_idnext_station_idinterchange_station_id一切都是satations表ID

架构

车站

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

路线

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');
    }
);

Route_Station - 枢轴

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()->nullable();
        $table->bigInteger('interchange_id')->unsigned()->nullable();
        $table->integer('station_order');
        $table->float('distance');
        $table->integer('duration');
        $table->timestamps();

        $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');

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

在管理区域,总共将有三个部分来管理车站和路线。

  1. 车站页面
  2. 路线页面
  3. 我可以在其中添加车站到路线的页面

这意味着我不会在创建stationroute时将记录插入到枢轴中,而是在上面提到的第 3 页之后的任何时间。

我现在有两个模型StationRoute并将关系设置如下。

车站模型

class Station extends Model
{
    public function routes()
    {
        return $this->belongsToMany('App\Route');
    }

    public function route()
    {
        return $this->belongsTo('App\Route');
    }
}

路线模型

class Route extends Model
{
    public function stations()
    {
        return $this->belongsToMany('App\Station');
    }

    public function station()
    {
        return $this->belongsTo('App\Station');
    }
}

所以现在的问题是,当stationroute记录已经存在时,我不知道如何将记录插入到数据透视表中以将所有列填充到role_station表中。

我曾尝试使用attach()但它给出了以下错误

照射/数据库/ QueryException与消息'SQLSTATE [HY000]:常规错误:1364字段'station_order'不具有默认值(SQL:INSERT INTO route_stationroute_idstation_id )值(2,4))'

所以我需要帮助

题:

我理解要求我设置station_order列值的错误,但我不知道如何传递next_station_idinterchange_station_idstation_orderdistanceduration

默认情况下,只有模型键会出现在pivot对象上。 如果数据透视表包含额外的属性,则必须在定义关系时指定它们:

return $this->belongsToMany('App\Route')->withPivot('next_station_id', 'interchange_station_id', 'station_order', 'distance', 'duration');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM