php的db类库Eloquent单独使用系列(1)
php的db类库Eloquent单独使用系列(2) - 分页
php的db类库Eloquent单独使用系列(3) - sql日志
php的db类库Eloquent单独使用系列(4)- 事件监听
php的db类库Eloquent单独使用系列(5)- 模型转数组
php的db类库Eloquent单独使用系列(6)- 一对一关联
php的db类库Eloquent单独使用系列(7)- 一对多关联
php的db类库Eloquent单独使用系列(8)- 多对多关联
php的db类库Eloquent单独使用系列(9)- 多对多关联 - 表关联自身
php的db类库Eloquent单独使用系列(10)- 多对多关联 - 远程一对多
php的db类库Eloquent单独使用系列(11)- 多对多关联 - 添加模型属性
php的db类库Eloquent单独使用系列(12)- 结果集模型转数组 - 2
安装同前,就不说了。
本文的目的是单独使用eloquent,脱离laravel环境使用,要求能打印sql日志。不想用laravel,但又想用eloquent。
下面的代码假定使用了一个表test2。
主要是3个文件,名字都可以自己改。路径也可以自己改,只要改namespace即可。
1)User是模型文件,里面啥都没有。
2)程序主文件。Ill.php
3)监听事件文件。SqlListener
模型文件User.php
<?php namespace app\model; class User extends \Illuminate\Database\Eloquent\Model { protected $table = 'test2'; public $timestamps = false; }
监听文件 SqlListener.php
<?php namespace app\model; class SqlListener implements \Illuminate\Contracts\Events\Dispatcher { /** * Dispatch an event and call the listeners. * * 注意:就改这个函数。也可以记录到文件日志里。 * * @param string|object $event * @param mixed $payload * @param bool $halt * @return array|null */ public function dispatch($event, $payload = [], $halt = false) { if ($event instanceof \Illuminate\Database\Events\QueryExecuted) { $sql=$event->sql; if ($event->bindings) { foreach($event->bindings as $v) { $sql = preg_replace('/\\?/', "'". addslashes( $v)."'", $sql,1); } } echo $sql."<br>"; } } public function listen($events, $listener){} public function hasListeners($eventName){} public function subscribe($subscriber){} public function until($event, $payload = []){} public function push($event, $payload = []){} public function flush($event){} public function forget($event){} public function forgetPushed(){} }
程序主文件,能够记录执行的sql代码,调试时真的很有实用价值!
<?php namespace app\control; use \Illuminate\Database\Capsule\Manager as Capsule; use app\model\User; class Ill { public function logdemo() { $capsule = new Capsule; $capsule->addConnection([ 'driver' => 'mysql', 'host' => '127.0.0.1', 'database' => 'test1', 'username' => 'root', 'password' => 'root', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', ]); $capsule->setAsGlobal(); $capsule->bootEloquent(); //设置sql日志监听 $capsule->setEventDispatcher(new \app\model\SqlListener() ); //下面是两种不同类型的sql操作,第一种是db门面,第2种使用了orm。 $users = $capsule::select('SELECT * FROM test2 limit 1'); $user = User::find(1); } }
下面是浏览器显示效果。
SELECT * FROM test2 limit 1 select * from `test2` where `test2`.`id` = '1' limit 1