Laravel 通過 Macros 實現列印原生 MySQL

蕭風發表於2020-02-24

背景:使用laravel的 toSql, 痛點是列印出來時沒有傳引數的,被用 ? 來代替了

1、在 $peoject/app/Providers 建立 QueryMacroServiceProvider 型別,並且整合 ServiceProvider

注意:$peoject 是指:你自己的專案名稱

溫馨提示:這裡面有一個小坑,
\Illuminate\Database\Query\Builder 適合用於DB,Illuminate\Database\Eloquent\Builder 適合用於ORM

2、註冊服務;在 config/app.php 的 providers 下,加入 App\Providers\QueryMacroServiceProvider::class。

 'providers' => [
        /*
         * Laravel Framework Service Providers...
         */
        App\Providers\QueryMacroServiceProvider::class,

    ],

3、QueryMacroServiceProvider 程式碼如下:

<?php


namespace App\Providers;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\ServiceProvider;

class QueryMacroServiceProvider  extends ServiceProvider
{
    public function boot()
    {
        /**
         * ORM 帶引數列印
         */
        Builder::macro('sql', function () {
            $bindings = $this->getBindings();

            foreach ($bindings as &$v) {
                $v = is_numeric($v) ? $v : "'".$v."'";
            }

            $sql = str_replace('?', '%s', $this->toSql());

            return sprintf($sql, ...$bindings);
        });

        /**
         * DB 帶引數列印
         */
        \Illuminate\Database\Query\Builder::macro('sql', function () {
            $bindings = $this->getBindings();

            foreach ($bindings as &$v) {
                $v = is_numeric($v) ? $v : "'".$v."'";
            }

            $sql = str_replace('?', '%s', $this->toSql());

            return sprintf($sql, ...$bindings);
        });
    }
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章