2016-02-29 60 views
0

我有一个模型叫运动,其采用以下结构Laravel 5 - 删除子模型数据

+----+--------------+-----------------+----------+---------------+--------------+--------------------+----------+-------+--------+---------------------+---------------------+ 
| id | campaignName | userId   | clientId | clientContact | contactEmail | campaignObjectives | acNumber | notes | active | created_at   | updated_at   | 
+----+--------------+-----------------+----------+---------------+--------------+--------------------+----------+-------+--------+---------------------+---------------------+ 
| 1 | test   |    7 |  10 | Mr Fakes  | 12345  | sdfsdfsd   | 12345 |  |  0 | 2016-02-29 11:51:59 | 2016-02-29 13:51:28 | 
+----+--------------+-----------------+----------+---------------+--------------+--------------------+----------+-------+--------+---------------------+---------------------+ 

然后我有一个CampaignTypes模型结构如下

+----+--------------+-----------------+------------+---------------------+---------------------+ 
| id | campaignType | creativeArrival | campaignId | created_at   | updated_at   | 
+----+--------------+-----------------+------------+---------------------+---------------------+ 
| 14 | Dynamic  | 2016-02-26  |   1 | 2016-02-23 16:00:01 | 2016-02-23 16:00:01 | 
+----+--------------+-----------------+------------+---------------------+---------------------+ 

在这些模型的关系非常简单。一个Campaign可以有许多CampaignTypes和一个CamapignType属于一个Campaign。

在Campaign架构中,我有一个活动列。这是我用来删除广告系列的内容。所以破坏方法如下所示

public function destroy(Campaign $campaign) 
{ 
    $campaign->update([ 
     'active' => false 
    ]); 

    Session::flash('flash_message', 'Campaign deleted'); 
    Session::flash('flash_type', 'alert-success'); 
    return Redirect::route('campaigns.index')->with('message', 'Campaign deleted.'); 
} 

现在虽然它不会引起太多的问题,我目前没有设置任何CampaignTypes行,就好像它的父活动已被删除,被删除。

什么是最好的方式来删除子数据而不实际删除它?

感谢

+0

使用软删除? – matiit

+0

当你“删除”你的父母(真正的软删除它)时,你想让这些活动类型真正被删除,还是他们也会有一个数据库列的值被更改? –

+0

我添加了一个更新的答案,我认为可以更好地解释您的选项。请让我知道,如果我的回答有意义,如果它不完全符合你的要求。 –

回答

2

你在做你的运动模型所谓的soft delete和Laravel实际上有一个很好的方式来处理(检查出的链接)。但是,如果您将active列更改为0,那么使用自己的惯例进行软删除是完全有效的。无论采用哪种方式,都没有自动的Eloquent方法来自动执行此操作,因此您需要一些代码来修改父模型。

如果您继续使用自定义软删除(与您现在一样),则最容易在Campaign模型上进行自定义删除方法。此方法将更新记录(软删除它)并删除任何子项。您尚未指定是否希望儿童模型被软删除或硬删除,但其中任何一个都很简单(如果您想软删除它们,只需遍历所有列并更新相关列)。

运动模式:

public function deleteAll() { 
    $campaign = self::find($this->id); 
    $campaign->update([ 
     'active' => false 
    ]); 

    //delete children, either hard or soft (use foreach loop on soft) 
    $campaign->types()->delete(); 
} 

然后你只需要调用您的控制器,自定义的方法。

public function destroy(Campaign $campaign) 
{ 
    $campaign->deleteAll(); 
} 

如果决定实施软删除Laravel约定(基本上添加deleted_at属性添加到模型,并使用一个特点),那么该模型的deletingdeleted事件将被触发,你可以listen for those和响应他们在模型的boot方法。

活动型号:

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

    static::deleting(function(campaign) { 
     //delete children, either hard or soft (use foreach loop on soft) 
     $campaign->types()->delete(); 
    }); 
} 

然后是被触发每次你在你的模型叫delete()时间,像这样:

public function destroy(Campaign $campaign) 
    { 
     $campaign->delete(); 
    }