2016-05-23 11 views
2

私はServiceTypesに属しているServiceInstancesの2つのモデルを持っています。サービスタイプは、私は、この「擬似」ロジックを実装しようとしていますServiceInstancesではいくつかのものとそれらの間でサービスlengthLaravel範囲に基づくBelongsTo関係

を決定します。

私はの$ this - を取得する必要があります>のServiceType() - >長さが、関係メソッドが失敗する

public function scopeExpired($query) { 
    $length = $query->serviceType()->length; 
    return $query->where('created_at', '<', Carbon::now()->subDays($length)); 
} 

アイデアはありますか?

+1

多分 'の$ this - > serviceType->長さ' - – Yurich

+0

が試していないカッコで成功せずにいること - 私が得るすべては、別のエラーがある: '[ErrorException]未定義のプロパティ:10月\雨\データベース\ビルダー:: $ serviceType' –

+1

**スコープはクエリを変更して実行しないでください。**サービスタイプテーブルの結合を行い、PHPではなくSQLで長さ比較を行いたいと思うでしょう。 – jfadich

答えて

0

$query->serviceType()を呼び出すと関係オブジェクトが返されますが、$query->serviceTypeはモデル自体を返します。今すぐ1つのモデルを取得しますが、oneToManyまたはmanyToMany関係がある場合は、モデルの配列を返します。

あなたがしようとしていることを行う正しい方法は、次のように角括弧なしでserviceTypeを呼び出すことです。

public function scopeExpired($query) { 
    $length = $query->serviceType->length; 
    return $query->where('created_at', '<', Carbon::now()- >subDays($length)); 
} 
+0

成功していないことを試してみました - 別のエラーが発生しました: '[ErrorException]未定義のプロパティ:October \ Rain \ Database \ Builder :: $ serviceType' –

1

スコープ内からクエリを実行しないでください。純粋なSQLを使用して同じことを達成できます。これを試してみてください。

public function scopeExpired($query) { 
    return $query 
     ->join('services', 'services.type_id', '=', 'service_types.id') 
     ->whereRaw('TO_DAYS(created_at) < DATE_SUB(NOW()) - service_types.length'); 
} 
関連する問題