2017-06-30 102 views
0

我有會員,人員和地址模型。他們與一對一關係相關。成員有一人,每人都有一個地址,地址屬於人,人屬於會員等。現在Laravel模型觀察者與關係

,我的地址也可以通過belongsTo一個位置...在2個可空colums所得,person_id & location_id

我在Address model上創建了一個觀察者。當我刪除會員時,如果設置了location_id,我想要保留該地址。

public function deleting(Address $address) 
{ 
    if($address->location_id != null) { 
     $address->person_id = null; 
     $address->save(); 
     return false; 
    } else { 
     return true; 
    } 
} 

奇怪的是,當我使用... ->address()->delete(); ......它會與人刪除地址,Observerfunction不會着火。我必須先分別刪除地址$address->delete();,現在Observerfunction將會啓動。 我正在考慮的另一個問題,如果這是另一回事呢?刪除'person_id'集的位置?

是否有更好的方法來處理刪除模型(可以)屬於2個不同的模型? (只有一對一關係)。

我在想也許我必須爲會員和地點製作2個觀察員,然後在地址模型上放一個觀察員?或者根本沒有

編輯使用觀察家:

所以情況可能會出現,一個人,一個位置可以有相同的地址。在這種情況下,'person_id'&'location_id'在地址模型上爲!= null。

到目前爲止,我擁有MemberController上的所有功能。在我的情況下, public function destroy($ id)只會軟刪除一個成員,並保持Person和Address不變。

我現在需要修復的是forceDeleting,我已經能夠想出一些東西,但我不確定什麼是好方法。氣味的東西:P 當我刪除成員這樣

$member->person()->delete(); 
$member->forceDelete(); 

這會工作。但我將不得不做3次刪除? (包括地址)。 同時刪除一個地址應取決於是否存在location_id,因爲當某個地址也屬於某個位置時,我希望保留該地址,而不是將person_id設置爲null。

我試圖通過使地址模型的觀察員,但與此Im我面臨的問題不知道其會員或地點被刪除,所以我不知道應該檢查哪個'_id'無論是否爲空。

我正面臨的另一個問題是,當我刪除Member-> relation() - >方法時,觀察者函數不會觸發。它似乎工作時,我分別刪除地址$ address-> delete(); 因爲這個我懷疑,如果觀察員甚至是一個好方法,也許我應該只是在成員/位置控制器。

/** 
* Permanently remove the specified resource from storage. 
* 
* @param int $id 
* @return Response 
*/ 
public function remove($id) 
{ 
    $member = $this->model->onlyTrashed()->find($id); 

    $address = $member->person->address; 
    if($address->location_id != null) { 
     $address->person_id == null; 
     $address->save(); 
    } else { 
     $address->delete(); 
    } 

    $member->person()->delete(); 
    $member->forceDelete(); 

這將工作,甚至可能是一個保持它愚蠢簡單的情況?但我不確定在這裏做這個地址的東西是一個好方法,只是試圖學習。

會員| hasOne - belongsTo |人員| hasOne - belongsTo |地址| belongsTo - hasOne |位置

+0

你讓我失去了一點點。你能總結一下你究竟在做什麼以及你做什麼/不想做什麼? –

+0

我已編輯我的問題;)sry –

回答

1

當你運行諸如$member->relation()->delete();之類的東西時,無法讓觀察者觸發的原因是因爲$member->relation()將僅返回Builder的實例。當你致電delete()Builder它只會執行查詢,並不會真正新建一個模型,這反過來將意味着一個事件永遠不會被解僱。爲了讓事件發生,你可以簡單地做$member->relation->delete();

如果我正確理解你的問題,那麼你可以添加一個監聽器/觀測到Person模式,將刪除不具有一個位置或使person_idnull如果它的地址:

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

    static::deleting(function (self $person) { 

     if (is_null($person->address->location_id)) { 
      $person->address->delete(); 
     } else { 
      $person->address->person_id = null; 
      $person->address->save(); 
     } 

    }); 
} 

然後在你的Member模型,你可以添加另一個刪除監聽器還檢查模式正在forceDeleted:

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

    static::deleting(function (self $member) { 

     if ($member->forceDeleting) { 
      $member->person->delete(); 
     } 
    }); 
} 

使用上述$member->delete()不會刪除該人員或地址,但是,$member->forceDelete()將導致該人員和地址被刪除(但只有該地址不屬於某個位置時,該地址纔會被刪除)。

希望這會有所幫助!

+0

嗯,我喜歡你在模型中保持它的方式,所以其他人不必看遍各地。它會保持我的成員內刪除函數短...我想我只是作爲MemberController的一個評論,說它也會刪除相關的模型,除非......我想在Person模型裏面做空檢查,在成員控制器中做更有意義......我想我以前見過類似這樣的東西,那麼做parent :: boot呢? –

+0

是的,你完全正確的'parent :: boot();'!哈哈,對不起,我完全錯過了。 –