【问题标题】:Laravel 5.2 query building for JSON on columnsLaravel 5.2 为列上的 JSON 构建查询
【发布时间】:2016-12-16 07:20:02
【问题描述】:

我正在使用 MySql 5.7.14 和 laravel 5.2。
我的表“用户”JSON 如下所示:

[{ “id”:“1”, "options": "{\"religion\": \"R'hllor, the Lord of Light\", \"favorite_color\": \"red\"}" }]

当我通过 laravel 查询时:

$ii =\DB::table('user')->where('options->favorite_color', 'red')->get();

我遇到了错误

SQLSTATE[HY000]: General error: 2036 (SQL: select * from `user` where `options`->"$.favorite_color" = red)

当我运行与

相同的查询时
SELECT * FROM `user` WHERE options->"$.favorite_color"='red'

在 phpmyadmin 中它没有给出任何错误,它工作正常。 谁能告诉我可能是什么问题? 提前致谢。

【问题讨论】:

  • 你能说明数据是如何存储在你的表中的,特别是选项列吗?
  • 感谢迈克。我会通过那个链接。
  • @Qazi : 选项栏看起来像:{"religion": "R'hllor, the Lord of Light", "favorite_color": "red"}

标签: php mysql orm laravel-5.2


【解决方案1】:

检查您的 PHP 版本,如果不是 7.0 或 7.1

然后将其指向正确的版本

sudo update-alternatives --set php /usr/bin/php7.1

为我工作

【讨论】:

    【解决方案2】:

    我得到了解决方案。 要使用 laravel 5.2 使用 MySQL 5.7.8 及更高版本,需要将 PDO 选项添加到 config/database.php 中的连接,如下所示。

     'mysql' => [
      'driver'    => 'mysql',
      'host'      => env('DB_HOST', 'localhost'),
      'database'  => env('DB_DATABASE', 'db_name'),
      'username'  => env('DB_USERNAME', 'root'),
      'password'  => env('DB_PASSWORD', ''),
      'charset'   => 'utf8',
      'collation' => 'utf8_unicode_ci',
      'prefix'    => '',
      'strict'    => false,
       'options'   => array(
               PDO::ATTR_CASE => PDO::CASE_LOWER,
               PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
               PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
               PDO::ATTR_STRINGIFY_FETCHES => true,
               PDO::ATTR_EMULATE_PREPARES => true,
           ),
    
    ],
    

    然后运行 ​​php artisan config:cache。 它运作良好。 vendor/laravel/framework/src/illuminate/Database/Connectors/Connector.php PDO 选项类似

    protected $options = [
        PDO::ATTR_CASE => PDO::CASE_NATURAL,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
        PDO::ATTR_STRINGIFY_FETCHES => false,
        PDO::ATTR_EMULATE_PREPARES => false,
    ];
    

    PDO::ATTR_STRINGIFY_FETCHES & PDO::ATTR_EMULATE_PREPARES 需要在 database.php 中被覆盖。

    【讨论】:

    • 谢谢,你救了我!
    • 像魅力一样工作。
    • 老兄!你太棒了:)谢谢。
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 2016-10-26
    • 2016-05-22
    • 2013-12-02
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多