Как мы уже говорили, позвольте мне опубликовать базовое решение для него.
У нас есть одна модель Post, такая как
class Post extends Model{}
, другая модель пакета
class Package extends Model{}
если у обоих есть первичный ключ 'id',
сводная таблица, описывающая отношения многих ко многим между ними, будет
package_id, комбинированный post_id как составной первичный ключ, что-то вроде
Schema::create('package_post', function (Blueprint $table) {
$table->unsignedInteger('package_id');
$table->unsignedInteger('post_id');
$table->foreign('package_id')->references('id')->on('packages')
->onUpdate('cascade')->onDelete('cascade');
$table->foreign('post_id')->references('id')->on('posts')
->onUpdate('cascade')->onDelete('cascade');
$table->primary(['package_id', 'post_id']);
});
В зависимости от требования могут быть некоторые другие столбцы.
Отношения будут выглядеть как
class Package extends Model {
public function posts()
{
return $this->belongsToMany( Post::class, 'package_post', 'package_id', 'post_id');
}
}
и
class Post extends Model {
public function packages()
{
return $this->belongsToMany( Package::class, 'package_post', 'post_id', 'package_id');
}
}
Теперь, когда вычтобы получить или отредактировать или удалить его, вы можете использовать методы attach, detach и т. д.
Для получения, если пакет id = 1 и вы хотите получить все сообщения, принадлежащие этому пакету, вы можете просто получитьэто как
$posts= Package::find(1)->posts;
Для вставки вы можете использовать
$package->posts()->attach($post->id);
Для обновления
$package->posts()->sync([$post_id]);
, если вы хотите изменить post_id 1 на 2
$package->posts()->wherePivot('post_id', 1)->sync(2);
Для отсоединения
$package->posts()->detach($post_id);
Чтобы проверить, существует ли связь
$package->posts->contains($post_id)