我有两个表 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_id , next_station_id , interchange_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');
    }
);

在管理区域,总共将有三个部分来管理车站和路线。
  • 站点页面
  • 航线页面
  • 一个页面,我可以在其中添加站点到路线

  • 这意味着我不会在创建 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');
        }
    }
    

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

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



    所以我需要帮助

    最佳答案

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

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

    关于php - 具有多列的 Laravel 数据透视表需要稍后插入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60317978/

    10-12 02:14