【问题标题】:Laravel: How to insert data in case of three way pivot table using attach methodLaravel:如何使用附加方法在三向数据透视表的情况下插入数据
【发布时间】:2015-02-18 09:49:51
【问题描述】:

这是我的桌子

id
board_name

id
class_name

主题

id
subject_name

board_classes

id
board_id
class_id

board_class_subjects

id
board_id
class_id
subject_id

我在我的模型中写了以下关联

Board.php

public function classes()
{
 return $this->belongsToMany('Clas','board_classes','board_id','class_id');
}

Clas.php

public function subjects()
{
    return $this->belongsToMany('Subject','board_class_subjects','class_id', 'subject_id');
}

我正在尝试使用以下代码在数据透视表board_class_subjects 中插入示例数据:

$data = array();
$data['board_id'] = 1;
$data['class_id'] = 1;
$data['subject_id'] = 1;

$pivot = Board::find(1);
$pivot->subjects()->attach($data);

但出现如下错误:

Call to undefined method Illuminate\Database\Query\Builder::subjects()

我知道我的 Board 模型中没有名为 subjects 的方法,但不知道如何实现它,以便我可以使用 attach 方法插入board_class_subjects 数据透视表中的数据。我应该在 Board 模型中添加另一个名为 sections 的方法,类似于“类”方法吗?

【问题讨论】:

    标签: laravel laravel-4 insert pivot-table record


    【解决方案1】:

    从技术上讲,BoardClas(s)Subject 的关系无关。但是,您可以像对待任何其他附加数据透视列一样对待board_id,并像记录的here

    那样插入它
    $subjectId = 1;
    $boardId = 1;
    $class = Clas::find(1);
    $class->subjects()->attach($subjectId, ['board_id' => $boardId]);
    

    或者,如果您已经收集了所有 id,您也可以在数据透视表上进行插入。 (attach() 并没有做太多其他事情)

    $data = array();
    $data['board_id'] = 1;
    $data['class_id'] = 1;
    $data['subject_id'] = 1;
    DB::table('board_class_subjects')->insert($data);
    

    【讨论】:

    • 如果你说不需要在 Clas.php 中创建 subject() 方法,那么我会收到以下错误 BadMethodCallException","message":"Call to undefined method Illuminate\\Database\\Query \\Builder::subjects() 没有其他方法可以使用附加方法插入记录吗?
    • 我从未说过Clas 中不需要subjects()。但是在您的示例中,您使用的是BoardSubject 之间的关系。就像你拥有它们一样离开关系
    • 那么在这种情况下我将如何在数据透视表中添加数据。我并不拘泥于只使用 Board。但只是检查是否有任何其他方法可以将数据插入到该数据透视表中。我实际上想使用附加方法而不是 DB::table ?
    • 由于 Laravel 不知道三重数据透视表,并且您使用的是两个 belongsToMany 关系的构造,因此您将始终必须将其附加到一个关系并添加另一个外键,如我的第一个示例所示.
    • 根据您的第一个示例, $pivot->subjects() 将不起作用,因为董事会和主题之间没有直接关系。一个董事会可能有多个班级,一个班级可能有多个主题,但数据透视表包含所有的关联,其中 board_id、class_id 和 subject_id 保存在表中...您能否向我发送聊天邀请以进一步讨论?
    【解决方案2】:

    我认为这是与数据透视表 board_classessubjects

    的多对多关系的解决方案

    board_classes

    id
    board_id
    class_id
    

    board_class_subjects

    id
    board_class_id
    subject_id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多