2015-08-23 1 views
9

я это выставляет таблицу, которая имеет следующую структуруКак мягко удалить связанные записи при мягком удалении родительской записи в Laravel?

id | name | amount | deleted_at 
2 iMac 1500 | NULL 

и таблицу платежей со следующей структурой

id | invoice_id | amount | deleted_at 
2 2   1000 | NULL 

Счет Модель

class Invoice extends Model { 

    use SoftDeletes; 

} 

вот код для удаления счет-фактура

public function cance(Request $request,$id) 
{ 
    $record = Invoice::findOrFail($id); 
    $record->delete(); 
    return response()->json([ 
     'success' => 'OK', 
    ]); 
} 

Платежи модели

class Payment extends Model { 

    use SoftDeletes; 

} 

softDelete на столе счетов работает отлично, но связанные с ним документы (платежи) по-прежнему exists.How я могу удалить их с помощью softDelete?

ответ

10

Eloquent не обеспечивает автоматическое удаление связанных объектов, поэтому вам нужно будет написать код самостоятельно. К счастью, это довольно просто.

Eloquent models Огонь различных событий на разных этапах жизненного цикла режима - вы можете узнать об этом подробнее: http://laravel.com/docs/5.1/eloquent#events. Вам нужен прослушиватель, который будет запущен, когда удален Событие уволено - этот слушатель должен удалить все связанные объекты.

Вы можете зарегистрировать модель слушателей в модели модели (). Слушатель должен перебирать все платежи за удаление счета и удалять их один за другим. Массовое удаление не будет работать здесь, поскольку оно будет выполнять SQL-запрос, непосредственно минуя события модели.

Это будет делать трюк:

class MyModel extends Model { 
    protected static function boot() { 
    parent::boot(); 

    static::deleted(function ($invoice) { 
     $invoice->payments()->delete(); 
    }); 
    } 
} 
+0

Не работает! FatalErrorException в Invoice.php линии 18: Невозможно сделать статический метод Осветите \ Database \ красноречивый \ Model :: загрузки() не статичным в классе App \ Models \ Invoice – user3407278

+0

Fixed, функция отсутствовала статический модификатор –

+0

Это работало красиво ! Большое спасибо! Означает ли это какие-либо проблемы с производительностью при мягком удалении примерно 100 записей? – user3407278

8

Вы можете пойти одним из двух способов с этим.

Самый простой способ будет переопределить Eloquents delete() метод и включают в себя соответствующие модели, а также, например:

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

выше метод должен работать только найти, но это, кажется, немного грязный, и я бы сказал, что это не предпочтительный метод внутри сообщества.

уборщик способом (ИМО) будет задействовать Eloquents событий т.д .:

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

    static::deleting(function($invoice) { 
     $invoice->payments()->delete(); 

    }); 
} 

Либо (но не оба) из указанных выше способов будет идти в вашей Invoice модели. Кроме того, я предполагаю, что у вас установлены ваши отношения в вашей модели, однако я не уверен, разрешаете ли вы несколько платежей за один счет-фактуру. В любом случае вам может потребоваться изменить payments() в примерах на то, что вы назвали отношениями в вашей модели счетов-фактур.

Надеюсь, это поможет!

+0

Calling удалить() по отношению платежей непосредственно обойдет модель и не будет запускать SoftDelete на родственных моделей. Они будут удалены из базы данных. Чтобы сделать soft-deleted, вам нужно вызвать delete() для каждой из связанных моделей. –

+0

Вам также не нужен оператор возврата в вашем переопределенном методе удаления - он должен делать «return parent :: delete();», в противном случае вы потеряете значение, которое будет возвращено из delete(), если вы его не перезаписали. –

+0

@ jedrzej.kurylo, я только что проверил, чтобы убедиться, и ДА, вы можете использовать soft delete в отношениях! –

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

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