gpt4 book ai didi

php - 在 Laravel 5.4 (Eloquent ORM) 中自动删除 NESTED 相关行

转载 作者:行者123 更新时间:2023-12-02 06:29:09 25 4
gpt4 key购买 nike

假设我有一本书。本书有章节,本书中的那些章节有子章节。

所以我有三个模型:

书籍 > 章节 > 子章节

当我删除这本书时($book->delete();),我还想删除这本书的相关章节以及书中所有章节的相关子章节。

在这里 (Automatically deleting related rows in Laravel (Eloquent ORM)) 我发现了 Eloquent Events。每当一本书被删除时,在此之前,章节就会被删除,因为我们 Hook :

class Book extends Eloquent
{
public function chapters()
{
return $this->has_many('Chapter');
}

protected static function boot() {
parent::boot();

static::deleting(function($book) {
$book->chapters()->delete();
});
}
}

所以我想,我只需要在我的 Chapter-Model 中实现相同的代码,只需将“Book”与“Chapter”交换,“Chapter”与“Subchapter”交换:

class Chapter extends Eloquent
{
public function subChapters()
{
return $this->has_many('SubChapter');
}

protected static function boot() {
parent::boot();

static::deleting(function($chapter) {
$chapter->subChapters()->delete();
});
}
}

当我删除章节时,这很好用。所有子章节也将被删除。

当我删除这本书时,它适用于章节。所有章节也将被删除。

但是,当我删除这本书时,它只会删除章节。它不会删除已删除章节的相关子章节。

谁能帮帮我?

最佳答案

那是因为当你同时删除多个对象时,并不会触发每个模型的启动删除功能,所以你应该循环遍历对象并一个一个地删除它们:

class Book extends Eloquent
{
public function chapters()
{
return $this->has_many(Chapter::class);
}

protected static function boot() {
parent::boot();

static::deleting(function($book) {
foreach($book->chapters as $chapter){
$chapter->delete();
}
});
}
}
/********************************/
class Chapter extends Eloquent
{
public function subChapters()
{
return $this->has_many(SubChapter::class);
}

protected static function boot() {
parent::boot();

static::deleting(function($chapter) {
foreach($chapter->subChapters as $subChapter){
$subChapter->delete();
}
});
}
}

但是我的建议是在表之间设置级联外键关系,以便 DBMS 自动删除相关行,下面的示例代码向您展示了如何在迁移文件中执行此操作:

 Schema::create('chapters', function (Blueprint $table) {
$table->increments('id');
$table->integer('book_id')->unsigned();
$table->string('title');
$table->timestamps();


$table->foreign('book_id')
->references('id')
->on('books')
->onDelete('cascade')
->onUpdate('cascade');
});

对子章节执行相同操作。希望对您有所帮助...

关于php - 在 Laravel 5.4 (Eloquent ORM) 中自动删除 NESTED 相关行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45075845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com