Laravel - 与多个 ID 的关系
Laravel - Relations with multiple ids
我有两个table:
1。 房间
2。 设施
设施 房间包含 id 和一个 varchar 列。
Room table 包含一个列 (facilities_id),显然,id 来自设施table。在该列中,我有一个多值,用逗号 (1,3,4) 分隔。
在它们之间建立关系的最佳方式是什么?类似于 "belongsTo" 关系,但具有多个 ID。
正如@jedrzej.kurylo所说,你需要一个多对多的关系。字符串ids作为逗号分隔的列表是错误的,它违反了First normal form并且使用起来非常不方便。
所以你应该重新考虑你的模型结构。
就像Alexander M. 说的,如果你改变你的结构会更好。 e. g.:
Schema::create('facilities', function (Blueprint $table) {
$table->increments('id');
$table->string('column')->unique();
$table->timestamps();
});
Schema::create('facility_room', function (Blueprint $table) {
$table->integer('facility_id')->unsigned();
$table->integer('room_id')->unsigned();
$table->foreign('facility_id')->references('id')->on('facilities')
->onUpdate('cascade')->onDelete('cascade');
$table->foreign('room_id')->references('id')->on('rooms')
->onUpdate('cascade')->onDelete('cascade');
});
Schema::create('rooms', function (Blueprint $table) {
$table->increments('id');
$table->string('column')->unique();
$table->timestamps();
});
在您的设施模型中:
public function rooms()
{
return $this->belongsToMany(Room::class);
}
在您的房间模型中:
public function facilities()
{
return $this->belongsToMany(Facility::class);
}
在我们的应用程序中:
$room = Room::find($id);
$facilities = $room->facilities();
我有两个table:
1。 房间
2。 设施
设施 房间包含 id 和一个 varchar 列。
Room table 包含一个列 (facilities_id),显然,id 来自设施table。在该列中,我有一个多值,用逗号 (1,3,4) 分隔。
在它们之间建立关系的最佳方式是什么?类似于 "belongsTo" 关系,但具有多个 ID。
正如@jedrzej.kurylo所说,你需要一个多对多的关系。字符串ids作为逗号分隔的列表是错误的,它违反了First normal form并且使用起来非常不方便。
所以你应该重新考虑你的模型结构。
就像Alexander M. 说的,如果你改变你的结构会更好。 e. g.:
Schema::create('facilities', function (Blueprint $table) {
$table->increments('id');
$table->string('column')->unique();
$table->timestamps();
});
Schema::create('facility_room', function (Blueprint $table) {
$table->integer('facility_id')->unsigned();
$table->integer('room_id')->unsigned();
$table->foreign('facility_id')->references('id')->on('facilities')
->onUpdate('cascade')->onDelete('cascade');
$table->foreign('room_id')->references('id')->on('rooms')
->onUpdate('cascade')->onDelete('cascade');
});
Schema::create('rooms', function (Blueprint $table) {
$table->increments('id');
$table->string('column')->unique();
$table->timestamps();
});
在您的设施模型中:
public function rooms()
{
return $this->belongsToMany(Room::class);
}
在您的房间模型中:
public function facilities()
{
return $this->belongsToMany(Facility::class);
}
在我们的应用程序中:
$room = Room::find($id);
$facilities = $room->facilities();