2016-10-27 11 views
1

私は私の物で、この範囲での問題を抱えているモデルLaravel 5.3適用範囲戻り

私の範囲は次のようになります。

public function scopeLessNinetyDays($query){ 

    $date = new \Carbon\Carbon; 
    $date->subWeek(12); 

    return $query->where('created_at', '<', $date->toDateTimeString())->get() ; 
} 

私は、カテゴリ内のループにそれを試してみましたが、結果は下部にあります。私は真実か偽かを返す必要があります。製品created_atがすでに12週間である場合。これはコレクションを返すので奇妙です。単一の製品の代わりに。私はこのコードを使用した場合

@foreach($category->product->take(4) as $product) 
     {{ dd($product->lessNinetyDays()) }} 
    @endforeach 

enter image description here

は、それが単一の製品を返します。下部の画像を参照してください。

@foreach($category->product->take(4) as $product) 
    {{ dd($product) }} 
@endforeach 

enter image description here

ため、私は結果をその目標を達成する方法がわかりません。

答えて

1

あなたは間違ってローカルスコープ。スコープは、データベースから行を選択するときに使用され、定義されたスコープと一致する行のみが使用されます。

あなたが探しているものは、「偽の属性」(アクセサー)のようなものです。これは、おそらくあなたが望むものを達成するための最も優雅な方法です。

まず、このアクセサを定義します。今すぐ

public function getIsLessNinetyDaysAttribute() { 
    $date = (new \Carbon\Carbon)->subWeek(12); 

    return $this->created_at->lt($date); 
} 

は、あなたが使用してこのプロパティにアクセスすることができます

@foreach($category->product->take(4) as $product) 
    {{ dd($product->is_less_ninety_days) }} 
@endforeach 

これは返す必要がありますどちらかまたはfalse。このスコープを定義した後

をローカルスコープを使用するための


例:今すぐ

public function scopeLessNinetyDays($query){ 

    $date = new \Carbon\Carbon; 
    $date->subWeek(12); 

    return $query->where('created_at', '<', $date->toDateTimeString())->get(); 
} 

、あなたはチェーン、この範囲をすることができますクエリを選択し、あなたのへ:

@foreach($category->product->lessNinetyDays()->get() as $product) 
    {{ dd($product) }} 
@endforeach 

このf oreachループでは、lessNinetyDaysスコープに一致する行のみが返されます。

あなたの目標を達成するには複数の方法がありますが、そのような場合はいつもアクセサーが好きです。

+0

ありがとうございました!あなたは私の誤解を打ちました.. – Rbex

0

スコープはクエリを選択するためのものです。 Local Scopes

モデルに次のものを追加するとtrueまたはfalseが返されます。

public function lessNinetyDays() 
{ 
    $date = new \Carbon\Carbon; 
    $date->subWeek(12); 

    return $this->created_at > $date; 
} 
0

範囲を間違って使用しています。

何も返されません。これはクエリを変更するだけで、何も返さない、特にクエリの結果は返されません。したがって、あなたが過去90日以内に作成された製品を取得したい場合は、次の操作を実行する必要があります、そして、

$query->where('created_at', '<', $date->toDateTimeString()); 

return $query->where('created_at', '<', $date->toDateTimeString())->get() ; 

を交換する必要があります。

$products->lessNinetyDays()->get(); 

詳細情報を表示:https://laravel.com/docs/5.3/eloquent#local-scopes