Php 使用附加逻辑删除子模型

Php 使用附加逻辑删除子模型,php,laravel,eloquent,Php,Laravel,Eloquent,我有一个父模型和一个子模型,比如说类别和帖子。Post模型可以附加一个特征图像,在删除Post时需要将其从存储器中删除,因此在myPostControllermyDistroy方法中如下所示: public function destroy($id) { $post = Post::findOrFail($id); if ($post->featured_image_path) { Storage::delete($post->featured_im

我有一个父模型和一个子模型,比如说类别和帖子。
Post
模型可以附加一个特征图像,在删除Post时需要将其从存储器中删除,因此在my
PostController
my
Distroy
方法中如下所示:

public function destroy($id)
{
    $post = Post::findOrFail($id);

    if ($post->featured_image_path) {
        Storage::delete($post->featured_image_path);
    }

    $post->delete();

    return redirect('/admin/posts');
}
My
CategoryController
有一个类似的
Distroy
方法,但是当它被销毁时,它还需要删除它的每个
Post
s。我知道我可以使用外键并依靠关系删除帖子,但这样做时,不会从存储中删除特色图片。我可以在我的
Category@delete
方法并检查特征图像,但在多个位置复制此逻辑似乎不正确


类别控制器
中删除
类别
时,从我的
Post
上的
destroy
方法运行逻辑的最佳方法是什么?

您可以使用这样的方法

class Categories extends Model

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

        static::deleted(function ($object) {
            // Logic to delete Post goes here...
        });
    }
}
class Post extends Model
{
    public static function boot()
    {
        parent::boot();

        static::deleted(function ($object) {
            // Logic to delete FeatureImage goes here...
        });
    }
}
像这样更改您的
类别
型号

class Categories extends Model

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

        static::deleted(function ($object) {
            // Logic to delete Post goes here...
        });
    }
}
class Post extends Model
{
    public static function boot()
    {
        parent::boot();

        static::deleted(function ($object) {
            // Logic to delete FeatureImage goes here...
        });
    }
}
Post
像这样的模型

class Categories extends Model

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

        static::deleted(function ($object) {
            // Logic to delete Post goes here...
        });
    }
}
class Post extends Model
{
    public static function boot()
    {
        parent::boot();

        static::deleted(function ($object) {
            // Logic to delete FeatureImage goes here...
        });
    }
}
因此,当一个
类别
被删除时,它对应的
Post
,然后将根据您的逻辑删除
图像


作为增强功能,您可以在
deleted()
method

中触发
事件

class Categories extends Model

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

        static::deleted(function ($object) {
            // Logic to delete Post goes here...
        });
    }
}
class Post extends Model
{
    public static function boot()
    {
        parent::boot();

        static::deleted(function ($object) {
            // Logic to delete FeatureImage goes here...
        });
    }
}
像这样更改您的
类别
型号

class Categories extends Model

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

        static::deleted(function ($object) {
            // Logic to delete Post goes here...
        });
    }
}
class Post extends Model
{
    public static function boot()
    {
        parent::boot();

        static::deleted(function ($object) {
            // Logic to delete FeatureImage goes here...
        });
    }
}
Post
像这样的模型

class Categories extends Model

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

        static::deleted(function ($object) {
            // Logic to delete Post goes here...
        });
    }
}
class Post extends Model
{
    public static function boot()
    {
        parent::boot();

        static::deleted(function ($object) {
            // Logic to delete FeatureImage goes here...
        });
    }
}
因此,当一个
类别
被删除时,它对应的
Post
,然后将根据您的逻辑删除
图像


作为增强功能,您可以在
deleted()内触发
事件
method

我认为最好将所有
$post->characterized\u image\u path
收集到一个数组或其他东西中,然后将其发送到清理作业并继续进行正常的关系删除。@CerlinBoss您如何将清理作业与关系删除联系起来?正如我所说的。首先收集阵列中要删除的文件的位置,然后分派作业进行清理,然后继续执行正常的删除过程。或者在成功删除
$category
$posts
后,使用观察者和
OberverServiceProvider
分派清理作业,这在我看来是一个更干净的解决方案。请参阅:我认为最好将所有
$post->特色图片路径
收集在一个数组或其他东西中,然后将其发送到清理作业并继续你的正常关系删除。@CerlinBoss你会如何将清理工作与关系删除联系起来?正如我所说。首先收集阵列中要删除的文件的位置,然后分派作业进行清理,然后继续执行正常的删除过程。或者在成功删除
$category
$posts
后,使用观察者和
OberverServiceProvider
分派清理作业,这将是一个更干净的解决方案。请参阅:我喜欢这种方法,特别是有可能在删除时触发事件。很高兴为您提供帮助:)是的,您可以使用Laravel观察员提取上述逻辑并清理您的模型。当您收听给定模型上的许多事件时,这很方便。我喜欢这种方法,尤其是在删除时触发事件的可能性。很高兴为您提供帮助:)是的,您可以使用Laravel观察员提取上述逻辑并清理模型。当您收听给定模型上的许多事件时,这很方便。