2017-08-01 45 views
1

問題:如何觸摸來自同一模型的模型?Laravel觸摸(遞歸)

詳細信息: 我正在使用Laravel 5.4構建用於在人員之間租用書籍的應用程序。 在每次交易中都有兩部分:有關所有者VS信息的信息,涉及出租人的信息。

因爲雙方,我選擇只使用一個名爲rents雙方的表。要區分哪些是我添加了包含「所有者」或「借款人」的字段rent_side。 如果我想顯示/搜索一個人的歷史,這可以很容易。如果有2個或更多的表格,我將不得不選擇所有顯示歷史記錄所需的數據。

由於共同編號爲couple_id,這兩個方面耦合在一起。

從每一面,我可以看到相對的一側由於地處模型App\Rent下面我命名reverse,在那裏我做的方法:

public function reverse() 
{ 
    return $this->hasOne('App\Rent', 'couple_id', 'couple_id') 
     ->where('id', '!=', $this->id); 
} 

因爲我需要更新父timestaps並根據laravel documentation我使用了以下內容:

protected $touches = ['reverse']; 

問題是,這種觸摸會影響同一模型。所以當我更新/插入一條新記錄時,請求在發送錯誤之前最多需要4分鐘。彷彿它進入了一個無限循環。

有沒有辦法從相同的模型觸摸模型?

+0

相關模型這的確是一個死循環,一個將觸按B這又將倒好,我建議傾聽雄辯的事件,並在不相等時更新反向的時間戳。 – milo526

+0

@ milo526感謝您的建議。讓我試試看吧。 – Warrio

回答

0

源代碼here確實表明它會導致無限循環。

我建議什麼是你做到以下幾點:

class Rent extends Model { 
     protected $touches = [ "reverse" ]; 

     protected function touchOwners() { 
      static $recursionCount = 0; 
      if ($recursionCount <= 1) { 
       $recursionCount++: 
       parent::touchOwners(); 
      } else { 
      $recursionCount=0; 
      } 
     } 
} 

沒有測試它所以不是100%肯定它會工作。

或者什麼工作是:

手動確保您觸摸每次保存模型

+0

不幸的是,使用建議的代碼覆蓋touchOwners方法並不能阻止無限循環:\ – Warrio

+0

如果通過「手動觸摸相關模型」,您的意思是更新反面的時間戳,因爲我使用了一個名爲[Plastic package](https://github.com/sleimanx2/plastic)的包,它與$ touches變量很好地協同工作。 – Warrio