2016-04-08 27 views
2

これは、ここでの私の最初の投稿ですので、どんな過ちを許してください:)Laravel - whereHas関係(から最新の記録)

私は現在、在庫管理アプリケーション(Laravel)のプロジェクトに取り組んでいます。私は何かがうまくいきませんので、助けを求めます。

私はいくつかの製品が他の製品との関係にあるテーブルを持っています。すべてが1つのテーブルで起こります。製品に子がある場合、その子は親をオーバーライドします。項目が子を持っていない

  • 場合は、それを使用する:

    products table view

    はその後、私はそれらを実行するすべてのクエリには、次のロジックを使用します。
  • 項目が子を持つ場合は、最新の子(最ID)

を使用今私はモデルファイルで作成された関係があります。

public function childItems(){ 
    return $this->hasMany('\App\OrderItem','parent_id'); 
} 

public function parentItem(){ 
    return $this->belongsTo('\App\OrderItem','parent_id'); 
} 

public function latestChild(){ 
    return $this->hasOne('\App\OrderItem','parent_id')->orderBy('id','desc')->limit(1); 
} 

をlatestChild()の関係に問題があること、ですあなたは、このクエリを実行すると: - 私はhasOneのにORDERBYと制限を追加する必要がありました、それを行うには

\App\OrderItem::find(7)->latestChild()->get() 

をそれは正常に動作し、関係で唯一の(最新)(ID 6)レコードを返します。 ()。

しかし、スコープでこの関係を使用する場合は、whereHASメソッドでは、正しく動作しません。最新のものではなく子を取ります。

public function scopeDue($query){ 
    return $query->where(function($q){ 
          $q->has('childItems','==',0)->has('parentItem','==',0)->whereDate('due_date','=', Carbon::today()->toDateString())->whereNull('return_date'); 
         })->orWhere(function($q2){ 
          $q2->has('childItems')->has('parentItem','==',0)->whereHas('childItems',function($q3) use($q2){ 
           $q3->whereDate('due_date','=', Carbon::today()->toDateString())->whereNull('return_date'); 
          }); 
         })->with('latestChild'); 

} 

ただし、最後の()は正しいレコードを返します。

私の関係latestChild()が(hasOne()にもかかわらず)すべての子を返し、whereHasでそれを使用するとき、私が適用したフィルタリング関数を無視するためです。

私はそれが私が記述しているものと少し複雑であることを知っていますが、それをよりよく説明するために例を使用します。数7はもちろん、ID 5が原因ですが、最新の子供が原因ではないID 6で子供を持っているよういじくり

\App\OrderItem::due()->get(); 

に次のように実行すると、唯一のレコードID 2を返す必要があります。

私は既にあなたが私に夢中になっているので、あなたが私を助けてくれるほど説明してくれることを願っています。 もし、私が必要としているものを変えたり、その全体のロジックを変えたりすることによって、私が必要とするものを達成する方法があれば、助けてください!

おかげで、 Darek

答えて

-1

私は問題はあなたがlimit(1)を行い、あなたのlatestChild()方法であると思います。代わりにlast()メソッドを試してみませんか?

ので:

public function latestChild(){ 
    return $this->hasOne('\App\OrderItem','parent_id')->last(); 
} 

EDIT:このように値を返すことについて

何:

public function latestChild(){ 
    $item = App\OrderItem::all()->last(); 
    return $item; 
} 
+0

は、お返事ありがとうございます!残念ながら、last()はBuilderでは使用できません。私はそれを取る、それは配列でのみ使用することができます。 –

+0

これはどうですか?^ – Norgul

+0

これは関係を返しませんが、最後のOrderItemはテーブル全体から(特定のオブジェクトには関係ありません)返されます。 –

関連する問題