`
xieye
  • 浏览: 810084 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

php的db类库Eloquent单独使用系列(3) - sql日志

    博客分类:
  • PHP
阅读更多
我的Eloquent单独使用系列文章
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

0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics