【问题标题】:How can i output/log the sql query generated by Fuel PHP's Orm queries?如何输出/记录 Fuel PHP 的 Orm 查询生成的 sql 查询?
【发布时间】:2013-04-15 07:42:52
【问题描述】:

是否有某种方法可以记录或输出从Model_Orm::query()Model_Orm::find() 生成的mysql 查询字符串?

我有一个复杂的Orm::query(),它没有给我预期的结果,我想知道为什么!

【问题讨论】:

    标签: fuelphp


    【解决方案1】:

    在执行任何运行查询的任何操作之后

    \Model_Something::find('all');
    \Model_Something::query()...
    \DB::query()...
    \DB::select()...
    

    你可以使用

    echo \DB::last_query();
    

    查看上次运行的内容,无论您使用哪种方式查询数据库。

    取自生产代码的工作示例:

    $product = Model_Product::find('all', array(
         'related' => array(
                  'i18ns',
         ),
         'where' => array(
                  array('i18ns.variant_slug', $slug)
         )
    ));
    
    echo \DB::last_query();
    exit;
    
    SELECT `t0`.`family_id` AS `t0_c0`, `t0`.`type_id` AS `t0_c1`,
           `t0`.`sort_weight` AS `t0_c2`, `t0`.`active` AS `t0_c3`,
           `t0`.`attribute_set` AS `t0_c4`, `t0`.`created_at` AS `t0_c5`,
           `t0`.`updated_at` AS `t0_c6`, `t0`.`site_id` AS `t0_c7`,
           `t0`.`temporal_start` AS `t0_c8`, `t0`.`temporal_end` AS `t0_c9`,
           `t0`.`id` AS `t0_c10`, `t1`.`id` AS `t1_c0`, `t1`.`product_id` AS `t1_c1`,
           `t1`.`language_id` AS `t1_c2`, `t1`.`slug` AS `t1_c3`,
           `t1`.`variant_slug` AS `t1_c4`, `t1`.`title` AS `t1_c5`,
           `t1`.`description` AS `t1_c6`, `t1`.`temporal_start` AS `t1_c7`,
           `t1`.`temporal_end` AS `t1_c8`
    FROM `products` AS `t0`
    LEFT JOIN `product_i18n` AS `t1`
         ON (`t0`.`id` = `t1`.`product_id`)
    WHERE `t1`.`variant_slug` = 'test-product'
    

    【讨论】:

    • 我在发布我的解决方案时尝试了这种方法,但对 ORM 查询不起作用,我不知道我是否错过了一些东西,你能发布一个查询示例吗,我只是在问为了学习。
    • 为你更新了我的例子
    • 它也适用于 ORM,问题可能是您想查看的查询不是最后一个查询。
    【解决方案2】:

    有一些方法可以实现这一点,如果你只是想打印你构建的复杂查询,请使用 get_query(); ORM 查询类的方法。

    下面是打印查询的示例代码。

    $queryToExecute = Model_Article::query()
            ->select('author')
            ->where('date', '<', time())
            ->where('draft', '=', 1);
    
    
    // This will print the query which is actually executed by your ORM 
    echo $queryToExecute->get_query();
    

    如果你想记录你的查询并执行

    $queryString = $queryToExecute->get_query();
    Log::info("Query that is executed {$queryString} ");
    

    如果你想分析你的查询的性能,你应该使用DB profiler, 通过在您的应用程序配置中启用。

    希望我上面的解决方案能解决你的问题

    【讨论】:

      【解决方案3】:

      执行查询后,可以使用follow语句

      echo \Database_Connection::instance(Model_Foo::$_connection)-&gt;last_query;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-20
        • 2017-01-02
        • 2012-10-27
        • 1970-01-01
        相关资源
        最近更新 更多