自动删除子模型
Deleting the children models automatically
我有三个模型:User
有很多 Post
有很多 Comment
.当我删除一个用户时,我希望自动删除他的所有相关帖子以及与这些帖子相关的评论。为了实现这一点,我在 User
和 Post
模型中有以下代码:
// User
protected static function boot() {
parent::boot();
static::deleting(function($user) {
$user->posts()->delete();
});
}
// Post
protected static function boot() {
parent::boot();
static::deleting(function($post) {
$post->comments()->delete();
});
}
当我删除一个用户时,他的所有帖子都会被删除,但是评论会被保留。为什么会这样?
你试过下一步了吗?
// User
protected static function boot() {
parent::boot();
static::deleting(function($user) {
foreach ($user->posts() as $post)
{
$post->comments()->delete();
}
$user->posts()->delete();
});
顺便说一句,这应该在删除级联的数据库模式中,您不需要任何模型代码来删除子项。
如果您使用数据库架构来实现这一点,效果会更好。它更快,不会有 'maximum function nesting level'
的错误
public function up()
{
Schema::create('comments', function(Blueprint $table)
{
$table->increments('id');
$table->integer('post_id');
$table->string('comment');
});
Schema::table('comments', function(Blueprint $table){
$table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');
});
}
我有三个模型:User
有很多 Post
有很多 Comment
.当我删除一个用户时,我希望自动删除他的所有相关帖子以及与这些帖子相关的评论。为了实现这一点,我在 User
和 Post
模型中有以下代码:
// User
protected static function boot() {
parent::boot();
static::deleting(function($user) {
$user->posts()->delete();
});
}
// Post
protected static function boot() {
parent::boot();
static::deleting(function($post) {
$post->comments()->delete();
});
}
当我删除一个用户时,他的所有帖子都会被删除,但是评论会被保留。为什么会这样?
你试过下一步了吗?
// User
protected static function boot() {
parent::boot();
static::deleting(function($user) {
foreach ($user->posts() as $post)
{
$post->comments()->delete();
}
$user->posts()->delete();
});
顺便说一句,这应该在删除级联的数据库模式中,您不需要任何模型代码来删除子项。
如果您使用数据库架构来实现这一点,效果会更好。它更快,不会有 'maximum function nesting level'
的错误public function up()
{
Schema::create('comments', function(Blueprint $table)
{
$table->increments('id');
$table->integer('post_id');
$table->string('comment');
});
Schema::table('comments', function(Blueprint $table){
$table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');
});
}