【问题标题】:Laravel join with LIKE CONCATLaravel 加入 LIKE CONCAT
【发布时间】:2018-02-08 11:33:58
【问题描述】:

Laravel 5.1.11

我在店里有一个简单的搜索:

public function search($request $request)
{
        return Catalog::where('title', 'like', '%'.$request->searchQuery.'%')
            ->orderBy('id', 'desc')
            ->paginate(50);
}

成功了!

但是人们正在寻找商品,所以:Pump BOSCH。搜索结果为空。

因为我改变了我的选择:

public function search($request $request)
{
    $searchQ = preg_split('/\s+/', $request->searchQuery, -1, PREG_SPLIT_NO_EMPTY);
    return Catalog::where(function ($q) use ($searchQ) {
               foreach ($searchQ as $value) {
                   $q->orWhere('title', 'like', "%{$value}%");
               }
           })
           ->orderBy('id', 'desc')
           ->paginate(50);
}

这是有效的),并显示所有Pumps

但我只想显示一个Pump bosch

我的数据库表manufactories

|  id  | title  |
| :--: | :----- |
|   1  |  AlKO  |
|   2  |  BOSCH |

AND catalogs,其中m_id 是来自表manufactoryid

|  id  |  m_id | title |     url    |
| :--: | :---: | :---- | :--------- |
|   1  |   1   |  pump | pump-alko  |
|   2  |   2   |  pump | pump-bosch |

如何更改 MySQL 搜索查询(添加 LEFT JOIN 和 CONCAT)以找到 Pump bosch? 让它看起来像这样:CONCAT('catalogs.title', ' ', 'manufactories.title') LIKE '%'.$request->searchQuery.'%'

【问题讨论】:

  • 这就是简单搜索的困境——很难预测客户究竟搜索什么。如果您更改查询,然后客户查找“pump siemens”而您碰巧没有 siemens 泵,该怎么办。或者他寻找“pump Aklo”(错字)。我建议你看看 Laravel Scout 和 Algolia。这为您提供了一个非常简单易用的搜索解决方案,Algolia 可免费用于较小的数据集laravel.com/docs/5.6/scout
  • 用户搜索,结果是0到n个数字,你给他们看,有什么问题?如果您有 n 个搜索结果,则显示结果
  • @mahdi-younesi 我需要在来自不同表的两个字段中进行搜索。喜欢这个CONCAT('catalogs.title', ' ', 'manufactories.title')LIKE '%'.$request->searchQuery.'%'
  • @michel-feldheim Laravel 5.1.11

标签: php mysql laravel-5 eloquent left-join


【解决方案1】:

你可以这样做,

        $data = DB::table('manufactories')
            ->join('catalogs','manufactories.id','=','catalogs.m_id')
            ->select('manufactories.title','catalogs.title')
            ->where(DB::raw('CONCAT(manufactories.title," ",catalogs.title)'), 'like',"%{$value}%")
            ->get();

希望对你有帮助

【讨论】:

  • 非常感谢您接受我的回答兄弟。如果对你有帮助别忘了点赞。
【解决方案2】:

您可以使用Query Builder 进行连接,例如

DB::table('catalogs')
    ->select('catalogs.*')
    ->join('manufactories', 'catalogs.m_id', '=', 'manufactories.id', 'left')
    ->where(function($q) use ($searchQ) {
        foreach ($searchQ as $value) {
            $q->orWhere('manufactories.title', 'like', "%{$value}%");
            $q->orWhere('catalogs.title', 'like', "%{$value}%");
        }
    })
    ->get();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多