2016-02-29 2 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 | 
+----+--------------+-----------------+------------+---------------------+---------------------+ 

отношения в этих моделях довольно прямолинейно. Кампания может иметь много CampaignTypes, а CamapignType принадлежит кампании.

В схеме кампании у меня есть активный столбец. Это то, что я использую для удаления кампании. Таким образом, метод уничтожения выглядит следующим образом

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, чтобы сделать это автоматически, поэтому вам понадобится немного кода для изменения родительской модели.

Если вы продолжаете использовать пользовательское мягкое удаление (как и сейчас), было бы проще всего создать собственный метод удаления в модели кампании. Этот метод обновит запись (мягкое удаление), а также удалит всех детей. Вы не указали, хотите ли вы также хотите, чтобы модели для детей были удалены или удалены, но один из них прост (если вы хотите их мягко удалить, просто пройдите через все и обновите соответствующий столбец).

модель кампании:

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 модели и использовать признак), то модели deleting и deleted события получат срабатывает, и вы можете 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(); 
    } 
Смежные вопросы