ホームページ >バックエンド開発 >PHPチュートリアル >DB Facadeのselectメソッドの分解
Laravel フレームワークのクエリ コンストラクターは非常に強力ですが、おそらく私の基礎が貧弱すぎます。 DB Facadeのselectメソッドを見てちょっと理解できなかったのでこの記事を思いつきました。
$users = DB::table('users')->select('uname, realname')->get();
Laravel Debugbar を介して上記のコードによって実行される SQL は次のとおりです:
select `uname`, `realname` from `users`
$sql = "select uname, realname from users";$users = DB::select($sql);
このように、実行されるSQL文はチェーンコール実行文と同じになります。
ドキュメントによると、 table() は指定されたデータ テーブルのクエリ ビルダー インスタンスを返します。これは DB Facade クラスにトレースされます
--文件位置 framework/src/Illuminate/Support/Facades/DB.php namespace Illuminate\Support\Facades;/*** @see \Illuminate\Database\DatabaseManager* @see \Illuminate\Database\Connection*/class DB extends Facade{ /** * Get the registered name of the component. * * @return string */ protected static function getFacadeAccessor() { return 'db'; }}
このファイルには静的メソッド table() はありません。しかし、このクラスは Facade クラスを継承します
Laravel Facade は、コンテナ内のサービスに型付きの静的インターフェイスを提供するクラスです。ドキュメントによると、ファサードはコンテナ サービスの基盤となる実装に触れることができるプロキシです。ファサード クラスを使用する利点は、開発者がサービスをより便利に使用できることです。
Facade クラスには $app という名前のプライベート プロパティが含まれており、その値はサービス コンテナへの参照です。
__callStatic マジック メソッドは、実際には存在しない静的メソッドへの呼び出しを処理するために使用されます。 Facade クラスはこのメソッドを実装していないためです。したがって、__callStatic はコンテナからそれぞれのサービスを取得して呼び出します。
__callStatic メソッド固有の実装:
--!文件位置 framework/src/Illuminate/Support/Facades/Facade.php /**+ Handle dynamic, static calls to the object.*+ @param string $method+ @param array $args+ @return mixed*/public static function __callStatic($method, $args){ $instance = static::getFacadeRoot(); if (! $instance) { throw new RuntimeException('A facade root has not been set.'); } switch (count($args)) { case 0: return $instance->$method(); case 1: return $instance->$method($args[0]); case 2: return $instance->$method($args[0], $args[1]); case 3: return $instance->$method($args[0], $args[1], $args[2]); case 4: return $instance->$method($args[0], $args[1], $args[2], $args[3]); default: return call_user_func_array([$instance, $method], $args); }}
$instance = static::getFacadeRoot() を使用して、このメソッドを呼び出すインスタンスを取得します
public static function getFacadeRoot(){ return static::resolveFacadeInstance(static::getFacadeAccessor());}
getFacadeAccessor() は DB Facade に実装されています。データベース」。
protected static function resolveFacadeInstance($name){ if (is_object($name)) { return $name; } if (isset(static::$resolvedInstance[$name])) { return static::$resolvedInstance[$name]; } return static::$resolvedInstance[$name] = static::$app[$name];}
__callStatic() と static:: 後期静的バインディングを介して。この疑似静的呼び出しが実装されています。これは、DB::select() が静的メソッドを通じて呼び出せる理由も説明しています。
最初の呼び出しメソッドに戻りましょう:
--文件位置 #Illuminate\Database\Querypublic function select($colums = ['*']){ $this->columns = is_array($columns) ? $columns : func_get_args(); return $this;}
ソース コードから、select は可変パラメーター関数であり、デフォルトで配列を受け取ることがわかります。
select を分解することで、他のファサードのメソッドがどのように機能するかを知ることもできます。