2014-08-14 2 views
0

Я пытаюсь сделать каскадную мягким удаляет работу перекрывая delete() функции каждой модели, которую я думаю, должен каскад вниз от Project до Version к Link, но проблема в том, что Безразлично» Кажется, что это вообще получается. Идея заключалась бы в том, что удаление проекта также приведет к удалению всех версий, которые удалили бы все ссылки и очистили их кешированные версии, но использование $this->versions()->delete();, похоже, фактически не вызывает метод delete() в модели Version.Каскадные мягкое удаляет с Laravel-не работает, как ожидалось

Любые идеи о том, как получить эту работу, как я ожидаю?

class Project extends Eloquent { 

    protected $softDelete = true; 

    public function versions() 
    { 
    return $this->hasMany('Version'); 
    } 

    public function delete() 
    { 
    $this->versions()->delete(); 
    return parent::delete(); 
    } 
} 

class Version extends Eloquent { 

    protected $softDelete = true; 

    public function project() 
    { 
    return $this->belongsTo('Project', 'project_id'); 
    } 

    public function links() 
    { 
    return $this->hasMany('Link'); 
    } 

    public function delete() 
    { 
    $this->links()->delete(); 
    return parent::delete(); 
    } 
} 

class Link extends Eloquent { 

    protected $softDelete = true; 

    public function version() 
    { 
    return $this->belongsTo('Version', 'version_id'); 
    } 

    public function delete() 
    { 
    Cache::forget($this->id); 
    return parent::delete(); 
    } 
} 

ответ

2

Вы хотите использовать models events вместо переопределения основные функции. Процитируем документы:

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

Что вы хотите сделать, это подключиться к ним. Вы можете сделать это несколькими способами (see the docs here). Вот пример, установив способ загрузки модели:

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

    /** 
    * Deleting 
    * - Called before delete() 
    * - Passes the instance in as param 
    */ 
    static::deleting(function($project){ 
     // Get the project versions ids as an array 
     $ids = $project->versions()->lists('id'); 

     // Delete the versions 
     Version::whereIn('id', $ids)->delete(); 
    }); 
} 

Тогда вы можете сделать то же самое в других моделях. Надеюсь, это поможет!

+0

К сожалению, это, кажется, не работает, а на самом деле, кажется, ведут себя как переопределенном функции удаления. Когда я вызываю удаление из проекта, версии удаляются, но он никогда не попадает на ссылки, и, насколько я могу судить, он даже не входит в метод 'static :: deleting' версий. Любые идеи, почему это было бы? – Samsquanch

+0

Похоже, я не единственный с этой проблемой: http://laravel.io/forum/03-26-2014-delete-relationschild-relations-without-cascade – Samsquanch

+0

Ах, я плохой да, вам нужно будет используйте запрос для удаления коллекции отношений. Обновлен мой ответ. –

1

$this->versions()->delete(); а также Version::whereIn('id', $ids)->delete(); делает запрос delete() на запрос строителя, а не на красноречивые модели, что означает, что события модели не срабатывают. Вместо этого вы должны сделать:

foreach($this->versions as $version) { $version->delete(); }

 Смежные вопросы

  • Нет связанных вопросов^_^