概要
laravelのモデルクラス::truncate();
の実装箇所と実行SQLをざっくり探ってみる。
内容
-
個々のモデルクラスを見る
-
個々のモデルクラスの継承元の
vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php
をみる -
下記のような記載があるこの記載のおかげでクエリビルダーが使えている
vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php/** * The Eloquent query builder class to use for the model. * * @var class-string<\Illuminate\Database\Eloquent\Builder<*>> */ protected static string $builder = Builder::class;
-
上記の記載をヒントに
vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php
を見る -
下記の処理が動作している事がわかる
vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php/** * Run a truncate statement on the table. * * @return void */ public function truncate() { $this->applyBeforeQueryCallbacks(); foreach ($this->grammar->compileTruncate($this) as $sql => $bindings) { $this->connection->statement($sql, $bindings); } }
-
余談だがdelete()は同クラスの近くに定義されていた
vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php/** * Delete records from the database. * * @param mixed $id * @return int */ public function delete($id = null) { // If an ID is passed to the method, we will set the where clause to check the // ID to let developers to simply and quickly remove a single row from this // database without manually specifying the "where" clauses on the query. if (! is_null($id)) { $this->where($this->from.'.id', '=', $id); } $this->applyBeforeQueryCallbacks(); return $this->connection->delete( $this->grammar->compileDelete($this), $this->cleanBindings( $this->grammar->prepareBindingsForDelete($this->bindings) ) ); }
-
どうやらSQL文はこちらで与えられているらしい
vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php
-
compileTruncate()
は下記、SQLのTRUNCATE TABLE
句を生成して実行している模様vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php/** * Compile a truncate table statement into SQL. * * @param \Illuminate\Database\Query\Builder $query * @return array */ public function compileTruncate(Builder $query) { return ['truncate table '.$this->wrapTable($query->from) => []]; }
-
MySQLの
TRUNCATE TABLE
句に関しては下記を参照