簡體   English   中英

其他條件不適用於 laravel 和 mysql 中的全文搜索

[英]other conditions does not work with full text search in laravel and mysql

我已經在 laravel 和 mysql 中實現了全文搜索,並且工作正常,但是當嘗試在與全文索引無關的字段(例如狀態和類型“它們存儲為枚舉”)的查詢中放置條件時出現問題.我正在嘗試選擇 type = image 和 status = 1 的產品,但結果包含所有類型的產品以及與全文搜索匹配的任何狀態。

這里是查詢

Product::accepted()
            ->select('products.id as id','products.type','products.display_image as display_path',
                'products.watermark',
                DB::raw("concat('[', group_concat(JSON_OBJECT('id', keywords.id , 'keyword',keywords.keyword)
                                    order by keywords.id separator ','), ']') as keywords"))
            ->join('products_keywords','products_keywords.product_id','products.id')
            ->join('keywords','keywords.id','products_keywords.keyword_id')
            ->whereRaw(
                "products.type = ?
                 AND MATCH(keywords.keyword) AGAINST(? IN BOOLEAN MODE)
                  OR MATCH(products.description) AGAINST(? IN BOOLEAN MODE)
                   Or MATCH(products.description_en) AGAINST(? IN BOOLEAN MODE)",
                ['image',$searchTerms,$searchTerms,$searchTerms])
            ->groupBy('products.id')->groupBy('products.display_image')
            ->groupBy('products.type')->groupBy('products.watermark')
            ->paginate(50);

Accepted 是產品模型中的范圍函數,它實現了條件 status = 1

public function scopeAccepted($query)
    {
        return $this->where('products.status','1');
    }

問題看起來像原始 sql 部分中的第一個OR正在否定所有先前的where屬性。 您可以將AND之后的所有內容包裝到一組括號中。
你可能想改變

            ->whereRaw(
                "products.type = ?
                 AND MATCH(keywords.keyword) AGAINST(? IN BOOLEAN MODE)
                  OR MATCH(products.description) AGAINST(? IN BOOLEAN MODE)
                   Or MATCH(products.description_en) AGAINST(? IN BOOLEAN MODE)",
                ['image',$searchTerms,$searchTerms,$searchTerms])

            ->whereRaw(
                "products.type = ?
                 AND (MATCH(keywords.keyword) AGAINST(? IN BOOLEAN MODE)
                  OR MATCH(products.description) AGAINST(? IN BOOLEAN MODE)
                   Or MATCH(products.description_en) AGAINST(? IN BOOLEAN MODE))",
                ['image',$searchTerms,$searchTerms,$searchTerms])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM