2017-09-04 62 views
2

下面是一个模型。我只想在没有其他模型引用它的情况下删除Telco条目?什么是最好的方法?Laravel - 删除没有关系

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Telco extends Model 
{ 
    public function operators() 
    { 
     return $this->hasMany('App\Operator'); 
    } 

    public function packages() 
    { 
     return $this->hasMany('App\Package'); 
    } 

    public function topups() 
    { 
     return $this->hasMany('App\Topup'); 
    } 

    public function users() 
    { 
     return $this->morphMany('App\User', 'owner'); 
    } 

    public function subscribers() 
    { 
     return $this->hasManyThrough('App\Subscriber', 'App\Operator'); 
    } 
} 
+0

你必须检查的所有其他表记录引用外键,而删除的存在。 –

+0

如果你的关系是正确的,尝试删除它并缓存异常(如果模型有儿童,将会触发) – aaron0207

+0

@SagarGautam这将是一个很长的方法,是否有任何有效的简短形式? – Mohammad

回答

2

您可以使用deleting模型事件,并检查删除前是否有相关记录,并防止删除(如果存在)。

在你Telco模型

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

    static::deleting(function($telco) { 
     $relationMethods = ['operators', 'packages', 'topups', 'users']; 

     foreach ($relationMethods as $relationMethod) { 
      if ($telco->$relationMethod()->count() > 0) { 
       return false; 
      } 
     } 
    }); 
} 
+0

在哪里使用这种方法?控制器还是模型? – Mohammad

+0

在您的电话模型 – chanafdo

+0

谢谢,它完美的工作! – Mohammad

0
$relationships = array('operators', 'packages', 'topups', 'users', 'subscribers'); 

$telco = Telco::find($id); 
$should_delete = true; 

foreach($relationships as $r) { 
    if ($telco->$r->isNotEmpty()) { 
     $should_delete = false; 
     break; 
    } 
} 

if ($should_delete == true) { 
    $telco->delete(); 
} 

嗯,我知道这是丑陋的,但我认为它应该工作。如果您不喜欢这个,请调用每个关系属性并检查它是否返回一个空集合(意思是没有关系)

如果所有关系都是空的,则删除!