Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Trình tạo truy vấn của Laravel Bộ chọn JSON `trường-> khóa` gây ra lỗi cú pháp

Không có gì sai với truy vấn của bạn. Đó là môi trường của bạn.

Vấn đề

Laravel's MySqlGrammar dịch khóa field->key ký hiệu trong tên trường (ở phía Laravel) vào trường field->'$.key' khai thác kiểu (ở phía MySQL):

/**
 * Wrap the given JSON selector.
 *
 * @param  string  $value
 * @return string
 */
protected function wrapJsonSelector($value)
{
    $path = explode('->', $value);

    $field = $this->wrapValue(array_shift($path));

    $path = collect($path)->map(function ($part) {
        return '"'.$part.'"';
    })->implode('.');

    // Here:
    return sprintf('%s->\'$.%s\'', $field, $path);
}

Tôi vừa xác nhận rằng MariaDB không hỗ trợ -> nhà điều hành khai thác làm bí danh cho JSON_EXTRACT() hàm số. Tuy nhiên, cùng một truy vấn hoạt động trên máy chủ MySQL 5.7 vani.

Giả sử test này bảng:

╔════╤══════════════════╗
║ id │ payload          ║
╟────┼──────────────────╢
║  1 │ {"a": 1, "b": 2} ║
╚════╧══════════════════╝

Truy vấn sử dụng -> người khai thác:

SELECT payload->"$.b" FROM test;

không thành công với MariaDB 10.2.8 trong khi nó mang lại 2 chính xác chống lại máy chủ MySQL 5.7.19.

Giải pháp

Giải pháp phù hợp phụ thuộc vào những gì bạn đang sử dụng trong quá trình sản xuất.

Thay thế MariaDB

Nếu bạn đang sử dụng MySQL, hãy thay thế MariaDB bằng MySQL trong env phát triển của bạn. Trên máy macOS được quản lý bởi homebrew, nó sẽ dễ dàng như sau:

brew services stop mysql
brew uninstall mariadb
brew install mysql
brew services start mysql

dữ liệu của bạn sẽ vẫn còn nguyên vẹn.

Viết lại các truy vấn của bạn

Tuy nhiên, nếu bạn đang sử dụng MariaDB trong sản xuất, bạn cần phải viết lại các truy vấn của mình để sử dụng JSON_EXTRACT() hoạt động như Elias đã được đề cập . Như bạn có thể thấy, bạn cần phải dài dòng hơn nhiều với API Laravel.

Truy vấn trên sẽ là:

SELECT JSON_EXTRACT(payload, "$.b") FROM test;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách kiểm tra xem tên người dùng đã tồn tại với PHP / MYSQL hay chưa

  2. Tạo hàng trống cho hàng lặp lại

  3. MYSQL chọn đếm theo giá trị

  4. không thể đánh rơi khóa ngoại

  5. Python:MySQL:Xử lý thời gian chờ