【问题标题】:whereJsonContains Laravel 5.6 not working?whereJsonContains Laravel 5.6 不工作?
【发布时间】:2019-01-03 20:27:28
【问题描述】:
$rosters = EventRosters::where('event_id', $event_id)
    ->whereJsonContains('players', $user_id)
    ->whereNull('deleted_at')
    ->get();

上述雄辩的查询似乎只在“玩家”json 数组中有单个项目时才有效。

存储在数据库中的数据如下所示: [1]["1","2"]

whereJsonContains 仅在数据库中看到 [1] 而在看到 ["1","2"] 时不起作用,是否有原因?

我对 Laravel 很陌生,并且一直在努力解决这个问题。

【问题讨论】:

    标签: php mysql json eloquent laravel-5.6


    【解决方案1】:

    文档有点简单

    https://laravel.com/docs/5.6/queries#json-where-clauses

    $rosters = EventRosters::where('event_id', $event_id)
        ->whereJsonContains(['players', [1,2]])
        //->whereNull('deleted_at') Unless you setup a scope at the model's bootup, 
        //Eloquent won't fetch soft deleted records
        ->get();
    

    根据您在该 json 列中的内容(如果 id),将 players 替换为 players->id

    【讨论】:

    • 'players' 包含 [1] 或 ["1","2"]。 $user_id 是用户的 id(即:1)我只是在寻找在 ["1","2"] 中找到的单个 id,但它似乎没有找到它。
    • 那么您很可能将它们保存错误。可能你正在提交一些东西,它正在以字符串的形式读取和存储
    【解决方案2】:

    数据类型必须匹配:

    // [1, 2]
    ->whereJsonContains('players', 1)   // Works.
    ->whereJsonContains('players', '1') // Doesn't work.
    
    // ["1", "2"]
    ->whereJsonContains('players', '1') // Works.
    ->whereJsonContains('players', 1)   // Doesn't work.
    

    【讨论】:

    • 为什么它在数据库中将单个保存为 [1] 但当有多个时它保存为 ["1","2"],而不是将单个保存为 ["1"]也一样?
    • 你是如何保存它们的?
    • $roster->players = json_encode($players,true);其中 $players 是一个数组
    • $players的内容是什么?
    • HTML 表单中的值始终是字符串。您可以使用以下方式将它们转换为整数:$players = array_map('intval', $request->players);
    【解决方案3】:

    你可以用 orWhere 解决问题

    $id = "1" // or = 1
    Model::whereJsonContains('ids', [$id])
      ->orWhere(function (Builder $q) use ($model) {
        $q->whereJsonContains('ids', [(string)$id]);
      });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 2022-08-19
      • 1970-01-01
      • 2019-08-02
      • 2018-09-04
      相关资源
      最近更新 更多