2017-08-01 7 views
1

質問:同じモデルからモデルに触れるには?ラーベール接触(再帰的)

詳細: 私はLaravel 5.4を使用して、人々の間で書籍を借りるためのアプリケーションを構築しています。 各取引には、2つの部分があります。所有者に関する情報:本を借りる人に関するVS情報。

2面のため、私はrentsという表を両面に使用することを選択しました。それを区別するために、「所有者」または「借り手」を含むフィールドrent_sideを追加しました。 人の履歴を表示/検索したい場合は、これで簡単にできます。 2つ以上のテーブルがある場合は、履歴を表示するために必要なすべてのデータを選択するためにUNIONを作成する必要があります。

これらの2つの面は、couple_idという共通のIDのおかげで一緒に結合されています。私は親timestapsを更新する必要があるとに応じますので

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

:それぞれの側から

、私はこの方法のおかげで、私は次の操作を行いところ、reverseという名前のモデルApp\Rentに位置して反対側を見ることができます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

「手動で関連モデルに触れる」というのは、逆の側のタイムスタンプを更新することを意味します。私は$ touches変数でうまく動作する[Plastic package](https://github.com/sleimanx2/plastic)というパッケージを使用しているからです。 – Warrio