【问题标题】:how to insert one to many relation in laravel?如何在laravel中插入一对多关系?
【发布时间】:2019-11-25 02:56:28
【问题描述】:

这是导航架构

    Schema::create('navigations', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name');
        $table->timestamps();
    });

这是子导航架构

    Schema::create('sub_navigations', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->bigInteger('nav_id')->unsigned()->index();
        $table->string('name');
        $table->timestamps();
        $table->foreign('nav_id')->references('id')->on('navigations')->onDelete('cascade');

    });

这是导航模型

public function subnavigations(){
    return $this->hasMany('App\Model\Admin\Sub_navigation');
}

这是子导航模型

public function navigation(){
    return $this->belongsTo('App\Model\Admin\Navigation');
}

控制器代码

public function store(Request $request)
{
    //return $request->all();
    $sub_navigation = new Sub_navigation;

    $sub_navigation->name = $request->name;
    $sub_navigation->nav_id = $request->navigation[0];
    //return $sub_navigation;
    //$sub_navigation->save();
    $navigation = Navigation::find($request->navigation[0]);
    // $navigation->subnavigations()->save($sub_navigation);
    //return $navigation;
    $sub_navigation->navigation()->associate($navigation);
    $sub_navigation->save();






    return redirect()->back();

}

这是错误信息

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'navigation_id' in 'field list' (SQL: insert into `sub_navigations` (`name`, `nav_id`, `navigation_id`, `updated_at`, `created_at`) values (Philosophy, 2, 2, 2019-11-25 02:17:33, 2019-11-25 02:17:33))

【问题讨论】:

    标签: php laravel laravel-5 eloquent


    【解决方案1】:

    来自文档:
    One To Many

    请记住,Eloquent 会自动确定 Sub_navigation 模型上正确的外键列。按照惯例,Eloquent 将使用拥有模型的“snake case”名称并以_id 为后缀。因此,Eloquent 会假设 Sub_navigation 模型上的外键是 navigation_id。您可以通过将附加参数传递给 hasMany 方法来覆盖外键:

    /**
     * Get the subnavigations for the navigation.
     */
    public function subnavigations(){
        return $this->hasMany('App\Model\Admin\Sub_navigation', 'nav_id');
    }
    

    One To Many (Inverse)

    Eloquent 会尝试将 Sub_navigation 模型中的 navigation_id 与 Navigation 模型上的 id 匹配。 Eloquent 通过检查关系方法的名称并在方法名称后加上 _ 后跟主键列的名称来确定默认的外键名称。但是,如果 Sub_navigation 模型上的外键不是 navigation_id,您可以将自定义键名称作为第二个参数传递给 belongsTo 方法:

    /**
     * Get the navigation that owns the sub_navigation.
     */
    public function navigation()
    {
        return $this->belongsTo('App\Model\Admin\Navigation', 'nav_id');
    }
    

    【讨论】:

      猜你喜欢
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-06
      • 2016-10-05
      • 2017-02-12
      • 1970-01-01
      相关资源
      最近更新 更多