首页 > 解决方案 > 使用查询构建器和 json 数据在 laravel 急切加载上使用 whereRaw 条件

问题描述

我想做的事:

获取 IntegrationProductMatches 模型。

“9+”字在 pAttributeList(jsonb) 或 pCityList(jsonb) 列中传递。

或者

单词“+9”出现在与之关联的 integration_product 表 (productCode(string)) 中。

或者

单词“+9”出现在与之关联的 integration_category 表 (pParentCategories(jsonb)) 中。

数据示例:

产品匹配表:

    +---+------------+-----------------+--------------------------------------------+----------------------------+
    |id | product id | category id     |                pAttributeList              |   pCityList                |
    +---+------------+-----------------+--------------------------------------------+----------------------------+
    | 1 | 16         | 7               |{"104187":"Yenido\u011fan","104290":"30 kg"}|{"4":"Adana"}               |
    | 2 | 17         | 7               |{"104187":"Yenido\u011fan","104290":"30 kg"}|NULL                        |
    | 3 | 18         | 14              |{"104187":"+9 Ya\u015f","104211":"11 kg"}   |NULL                        |
    +---+------------+-----------------+--------------------------------------------+----------------------------+

产品表:

productCode 列类型为字符串

类别表:

+---+------------------------------------------------------------------------------------+
|id |                pParentCategories                                                   |  
+---+------------+-----------------+------------------------------------------------------
| 7 |["Anne ve Bebek","Bebek Arabas\u0131 Pusetleri","3 Tekerlekli Bebek Arabalar\u0131"]|

我的查询:

 $pairings = IntegrationProductMatches::where(function ($query) use ($columns, $search) {
            foreach ($columns as $i => $column) {
                if ($i === 0) {
                    $query->whereJsonContains($column, $search);
                    continue;
                }

               $query->orWhereJsonContains($column, $search);
            }
        })
            ->orWhereHas("product", function ($query) use ($search) {
                $query->where("productCode", "LIKE", "'%" . $search . "%'");
            })
            ->orWhereHas("category", function ($query) use ($search) {
                $query->whereRaw('JSON_SEARCH(pParentCategories, "one", \'"%' . $search . '%"\')');
            })
            ->get()
            ->all();

关系:

  public function product(): \Illuminate\Database\Eloquent\Relations\BelongsTo
    {
        return $this->belongsTo(IntegrationProduct::class, 'productID');
    }

    public function category(): \Illuminate\Database\Eloquent\Relations\BelongsTo
    {
        return $this->belongsTo(IntegrationCategory::class, 'categoryID');
    }

我想在一个句子中获取选定单词的数据。

标签: jsonlaravelloadinglaravel-query-buildereager

解决方案


推荐阅读