Le contenu de cet article concerne le modèle (code) d'analyse du code source de Laravel. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.
Je souhaite par avance aux singes une bonne fête nationale. Mangez bien, buvez bien et amusez-vous.
Selon le principe de développement à responsabilité unique, pendant le processus de développement de Laravel, chaque table doit établir un modèle pour les services et les appels externes. Semblable à ceci
namespace App\Models; use Illuminate\Database\Eloquent\Model; class User extends Model { protected $table = 'users'; }
Les opérations de données de Laravel sont divisées en deux types
Façade DB
ORM éloquent
En plus de leurs propres caractéristiques, les opérations de données de base sont effectuées via IlluminateDatabaseQueryBuilder
méthodes d'appel pour compléter l'intégralité du SQL. Vous pouvez également utiliser la classe Builder comme classe de base pour l'ensemble de l'opération SQL. Ce cours couvre les méthodes de fonctionnement suivantes (affichage partiel)
方法 |
---|
public function select($columns = ['*']) |
public function selectSub($query, $as) |
public function selectRaw($expression, array $bindings = []) |
public function fromSub($query, $as) |
public function fromRaw($expression, $bindings = []) |
public function addSelect($column) |
public function distinct() |
public function from($table) |
public function join($table, $first, $operator = null, $second = null, $type = 'inner', $where = false) |
public function joinWhere($table, $first, $operator, $second, $type = 'inner') |
public function joinSub($query, $as, $first, $operator = null, $second = null, $type = 'inner', $where = false) |
public function leftJoin($table, $first, $operator = null, $second = null) |
public function where($column, $operator = null, $value = null, $boolean = 'and') |
public function orWhere($column, $operator = null, $value = null) |
public function whereRaw($sql, $bindings = [], $boolean = 'and') |
public function whereIn($column, $values, $boolean = 'and', $not = false) |
public function orWhereIn($column, $values) |
On peut voir qu'il existe de nombreuses méthodes qui ne sont pas reflétées sur le site Web chinois de Laravel ou dans les documents officiels, donc même si vous voulez être compétent dans un framework, ne le lisez pas. Le code source ne fonctionne pas non plus. Ce fichier se trouve sous supplier/laravel/framework/src/Illuminate/Database/Query dans le répertoire de votre projet. Vous pouvez le vérifier vous-même.
Normalement, vous pouvez écrire une opération comme celle-ci
DB::table('user')->get();
Cette opération pointe d'abord vers le fichier via la façade de Laravel, mais elle n'est pas dans app.php , mais est chargé directement via le noyau, il est enregistré dans
Illuminate\Foundation\Application -> registerCoreContainerAliases()
. La façade appelle directement la classe IlluminateDatabaseDatabaseManager.
public function registerCoreContainerAliases() { foreach ([ ... 'encrypter' => [\Illuminate\Encryption\Encrypter::class, \Illuminate\Contracts\Encryption\Encrypter::class], 'db' => [\Illuminate\Database\DatabaseManager::class], 'db.connection' => [\Illuminate\Database\Connection::class, \Illuminate\Database\ConnectionInterface::class], 'events' => [\Illuminate\Events\Dispatcher::class, \Illuminate\Contracts\Events\Dispatcher::class], 'files' => [\Illuminate\Filesystem\Filesystem::class], .... ) }
IlluminateDatabaseDatabaseManager Il ne contient pas beaucoup de code, la plupart gère les liens de base de données. Lorsque vous utilisez DB::table(), il sera transmis via
public function __call($method, $parameters) { return $this->connection()->$method(...$parameters); }
Ce qu'on appelle IlluminateDatabaseConnection. L'utilisateur traite la méthode table(), puis pointe vers la classe IlluminateDatabaseQuery via la table. (). Parlons-en au début. Après avoir passé cette catégorie, je n'entrerai pas dans les détails ici. Ensuite, il y a l'épissage de divers sql->exécuter sql->terminer la bataille
Eloquent ORMEloquent ORM est similaire à la façade DB Tout d'abord, chaque Eloquent ORM doit hériter de la classe parent IlluminateDatabaseEloquentModel
Vous le ferez. écrivez probablement comme ça
User::find(1)
public static function __callStatic($method, $parameters) { return (new static)->$method(...$parameters); }
User::get()
public function __call($method, $parameters) { if (in_array($method, ['increment', 'decrement'])) { return $this->$method(...$parameters); } return $this->newQuery()->$method(...$parameters); }
new Builder()
public function newEloquentBuilder($query) { return new Builder($query); }
$this->query->{$method}(...$parameters);
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!