2016-03-08 4 views
3

У меня есть клиентов модели, которые hasMany Locations и Locations hasMany контакты.Удаление связанных записей в Laravel 5.1 (Eloquent ОРМ)

Я хочу удалить Клиента и все его местоположения и контакты.

Теперь ниже код удаляет местоположения успешно:

$customer = Customer::find($id); 
$customer->locations()->delete(); 

Но я хочу, чтобы удалить контакты, а также.

В идеале я хочу код, как:

$customer->locations()->contacts()->delete(); 

Можно ли ??

ответ

0

Вы можете установить это в ваших миграциях, указав onDelete('cascade') в сводной таблице, посмотрите на foreign-key-constraints, например:

$table->foreign('customer_id')->references('id')->on('customers')->onDelete('cascade'); 
$table->foreign('location_id')->references('id')->on('locations')->onDelete('cascade'); 

Или использовать eloquent events, что вы хотите в этом случае является «удалением» события для очистки.

Клиент Модель:

class Customer extends Eloquent 
{ 
    protected static function boot() { 
     parent::boot(); 

     static::deleting(function($customer) { 
      $customer->locations()->delete(); 
     }); 
    } 
} 

Расположение Модель:

class Location extends Eloquent 
{ 
    protected static function boot() { 
     parent::boot(); 

     static::deleting(function($location) { 
      $location->contacts()->delete(); 
     }); 
    } 
} 

Hopet это помогает.

+0

Я знаю ограничение внешнего ключа, но я только хотел обработать его на уровне кода, поскольку эти ограничения замедляют производительность. –

0

Вы можете определить это в своих моделях.

Клиент Модель

class Customer extends Eloquent 
{ 
    public function locations() 
    { 
     return $this->has_many('Location'); 
    } 

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

     static::deleting(function($customer) { 
      // before delete() method call this 
      $customer->locations()->delete(); 
      // do the locations cleanup... 
     }); 
    } 
} 

И в ваших Locations Модель

class Location extends Eloquent 
    { 
     public function contacts() 
     { 
      return $this->has_many('Contact'); 
     } 

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

      static::deleting(function($location) { 
       // before delete() method call this 
       $location->contacts()->delete(); 
       // do the contacts cleanup... 
      }); 
     } 
    } 

И теперь

$customer = Customer::find($id); 
$customer->delete(); 

Если сделать трюк.

+0

не работает, поскольку он удаляет только местоположения, а не контакты местоположения. Я думаю, что это работает только для отношений «один ко многим», в моем случае есть много мест для клиентов, и в каждом месте есть несколько контактов. –

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