2017-11-02 5 views
1

例を挙げて説明しましょう。モデルクエリにスコープを連結することはできますか?

Model::staticMethod()->localScope()->get(); # works 
Model::staticMethod()->nonStaticMethod()->get(); # fail 

私はあなたのモデルメソッドは静的である必要があり、あなたが連鎖以上のメソッドしたい場合、以下のものがローカルスコープのメソッドである必要があることを前提とする権利ですか?

はのは、私はチェーン3つのメソッドとシーケンスは、私は私のモデルを設定するに行くかどう

Model::method1()->method2()->method3(); 
Model::method2()->method1()->method3(); 

を意味し、任意であり、クエリを持つようにしたいとしましょうか?

+0

:あなたが興味を持っている場合、実際にスコープを実装するコードは、その__callメソッドに以下の3行

です –

+0

こんにちは@AngadDubey、答えとして例を挙げることはできますか? – rock3t

答えて

1

staticMethodがクエリを開始した場合、その点以降のローカルスコープのメソッドしか使用できなくなります。モデルクラスのインスタンスを実際に返すModelクラスに独自の静的メソッドを追加して、モデルのインスタンスを設定できるようにすることで、この問題を回避できます。 (または、これを既に行っているcreate()のような静的メソッドを使用してください)

これは、ほとんどの静的メソッドが実際にはModelクラスのインスタンスを返しませんが、Illuminate \ Database \ Eloquent \ Builderクラス(https://laravel.com/api/5.3/Illuminate/Database/Eloquent/Builder.html)。

Builderの__call()マジックメソッドは、Builderクラスに実際には存在しないすべての関数をインターセプトし、関数名を使用してあらゆる種類の魔法を実行します。限り、あなたの方法は、クエリビルダを返すように、あなたがチェーン彼らにできるはずです

if (method_exists($this->model, $scope = 'scope'.ucfirst($method))) { 
     return $this->callScope([$this->model, $scope], $parameters); 
} 
+0

おかげでSchalks。あなたは、実際にモデルのインスタンスを返すModelクラスに独自の静的メソッドを追加して、そこから設定できるようにすることで、この問題を回避することができますか? (または、これをすでに行っているcreate()のような静的メソッドを使用してください)。_ – rock3t

関連する問題