Laravel - 多对多关系设置

时间:2017-11-12 15:37:35

标签: laravel

我正在使用Laravel 5,并试图让我的头脑关系。

我有2张桌子,学生和房间。每个房间可以有很多学生,每个学生可以有很多房间。

这是两个方向的多对多关系吗?我需要一个数据透视表来实现这个目标吗?

4 个答案:

答案 0 :(得分:1)

  

这是两个方向的多对多关系吗?

是的,你需要双向的多对多关系

  

我需要一个数据透视表来实现这一目标吗?

是的

您可以看到有关多对多关系的更多信息here

答案 1 :(得分:1)

是的,你描述的是多对多的关系,为此你需要一个数据透视表。

您的三个表格如下所示: (这可能与您的实际表格不同)

students

id (primary key)
name
age

rooms

id (primary key)
room_size
bedroom_count

注意:默认情况下,数据透视表的名称由两个模型名称(单数形式)按字母顺序组成。所以在这种情况下:学生+房间= room_student。

room_student(数据透视表)

room_id (foreign key to 'rooms')
student_id (foreign key to 'students')

数据透视表迁移:

class CreateRoomStudentTable extends Migration
{
    public function up()
    {
        Schema::create('room_student', function (Blueprint $table) {
            $table->unsignedInteger('room_id');
            $table->unsignedInteger('student_id');

            // Primary key
            $table->primary(['room_id', 'student_id']);

            // Both foreign keys
            $table->foreign('room_id')
                ->references('id')
                ->on('rooms')
                ->onDelete('cascade');
            $table->foreign('student_id')
                ->references('id')
                ->on('students')
                ->onDelete('cascade');
        });
    }

    // ...

RoomStudent型号:

class Room extends Model {
    // ...
    public function students()
    {
        $this->belongsToMany(App\Student::class);
    }
}

class Student extends Model {
    // ...
    public function rooms()
    {
        $this->belongsToMany(App\Room::class);
    }
}

答案 2 :(得分:0)

是的,你可以实现多对多关系,你肯定需要数据透视表来实现多对多的关系。 在这种情况下,您可以创建像room_student这样的数据透视表,并在其中添加room_id和student_id列。然后只需在模型中使用belongsToMany方法定义关系,并记住在你想要附加功能时使用附加方法。

答案 3 :(得分:0)

您需要一个数据透视表。

关于这一点,你可以从这里找到更多信息:

ManyToManyRelationship