Quay lại

Outputting Eloquent query unparameterized trong Laravel Chuyên mục PHP và Laravel    2023-09-10    456 Lượt xem    36 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Outputting Eloquent query unparameterized trong Laravel

Một trong nhiều lợi ích của việc sử dụng Laravel làm framework là khả năng tùy biến rất lớn mà nó đi kèm. Vì vậy, bạn có thể sử dụng điều này để khắc phục một số hạn chế.

Ví dụ: hiện tại, nếu bạn muốn xuất một truy vấn Eloquent ở dạng SQL, bạn có thể gọi phương thức toSql() trên đó như vậy.

$books = Book::where('author', 'Ruskin Bond')->toSql();

dd($books);
// select * from `books` where `author` = ?

Như bạn có thể thấy, toSql() sẽ xuất truy vấn nhưng nếu bạn nhận thấy thì nó không thực sự xuất ra các tham số được truyền cho nó. Thay vào đó, nó sẽ chỉ in ?. Điều này là do Laravel sử dụng các câu lệnh đã chuẩn bị sẵn. Chúng là một cách viết câu lệnh SQL mà không bỏ các biến trực tiếp vào chuỗi SQL. Các ? bạn thấy là phần giữ chỗ hoặc ràng buộc cho thông tin mà sau này sẽ được PDO thay thế.

Điều này có nghĩa là bạn cần phải thay thế ? bằng các giá trị thực trong truy vấn của mình theo cách thủ công, điều mà bạn có thể thấy là cồng kềnh nếu bạn chỉ muốn gỡ lỗi nó trong chương trình GUI SQL yêu thích của mình chẳng hạn như MySQL Workbench.

Vì vậy, làm thế nào để có được xung quanh này? Đọc tiếp nhé !.

The toRawSql macro

Gần đây, trong một tweet của @kirschbaum_dev, tôi đã biết về macro toRawSql tùy chỉnh này (mà bạn có thể xác định trong phương thức boot của AppServiceProvider) có thể được sử dụng để xuất truy vấn SQL không được tham số hóa.

use Illuminate\Database\Eloquent\Builder;

Builder::macro('toRawSql', function() {
    return array_reduce($this->getBindings(), function($sql, $binding) {
        return preg_replace('/\?/', is_numeric($binding)
            ? $binding
            : "'".$binding."'", $sql, 1);
    }, $this->toSql());
});

Như bạn có thể thấy, macro sử dụng phương thức getBindings() trả về một mảng gồm tất cả các giá trị tham số của truy vấn được kết hợp với hàm preg_replace để thay thế các giá trị đó bằng ? trong truy vấn được trả về bởi phương thức toSql().

Vì vậy, nếu muốn sử dụng macro này trong ví dụ trước, chúng ta có thể sử dụng nó như sau:

$books = Book::where('author', 'Ruskin Bond')->toRawSql();

dd($books);
// select * from `books` where `author` = 'Ruskin Bond'

Như bạn có thể biết, bằng cách sử dụng macro này, giờ đây chúng ta có một truy vấn SQL thô với các giá trị tham số đã được điền vào!

Khá tiện dụng phải không?

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday