简体   繁体   English

PHP Laravel 从多个输入中使用多个关键字搜索多个表

[英]PHP Laravel search multiple tables with multiple keywords from multiple inputs

I have two tables in db, "deals" and "deals_meta" connected between them with a foreign key.我在数据库中有两个表,“deals”和“deals_meta”用外键连接在它们之间。 In the "deals" table i have general information about a deal like, title, description, category etc., and in the "deals_meta" i have other specific details like, location, number of bedrooms, price, booking date and so on.在“deals”表中,我有关于交易的一般信息,如标题、描述、类别等,在“deals_meta”中我有其他具体细节,如位置、卧室数量、价格、预订日期等。

I have a form with multiple fields, title, details, booking date, price range and so on.我有一个包含多个字段、标题、详细信息、预订日期、价格范围等的表单。

My problem is that i can't retrieve from db the deals based on the search query.我的问题是我无法根据搜索查询从数据库中检索交易。

The code that i use to retrieve the queries looks like this:我用来检索查询的代码如下所示:

$deals = Deals::where('deals_providers', $provider)->where('deal_types', $dealType)->with('meta')
            ->where(function ($query) use ($terms, $dealType) {
                $query->whereHas('meta', function ($query) use ($terms, $dealType) {
                    $search = $query->where('deal_type', 'like', '%' . $dealType . '%');
                    if ($terms['location']) {
                        $search = $query->orWhere('location', 'like', '%' . $terms['location'] . '%');
                    }
                    if ($terms['price_from']) {
                        $search = $query->orWhere('price', '>', '%' . $terms['price_from'] . '%');
                    }
                    if ($terms['price_to']) {
                        $search = $query->orWhere('price', '<', '%' . $terms['price_to'] . '%');
                    }
                    if ($terms['departs_from']) {
                        $search = $query->orWhere('departs_from', 'like', '%' . $terms['departs_from'] . '%');
                    }
                    if ($terms['duration']) {
                        $search = $query->orWhere('duration', 'like', '%' . $terms['duration'] . '%');
                    }
                    if ($terms['available_start']) {
                        $search = $query->orWHere('available_start', 'like', '%' . $terms['available_start'] . '%');
                    }
                    if ($terms['available_end']) {
                        $search = $query->orWhere('available_end', 'like', '%' . $terms['available_end'] . '%');
                    }

                    return $search;
                });
                if ($terms['title']) {
                    $query->orWhere('title', 'like', '%' . $terms['title'] . '%');
                }
                if ($terms['details']) {
                    $query->orWhere('details', 'like', '%' . $terms['details'], '%');
                }
            })->get();

        Debug::data($deals);

If i search for title or details, it returns only the deals that have that title or contains that details but if i search for location or any other meta related term, it returns all the deals results from the db.如果我搜索标题或详细信息,它仅返回具有该标题或包含该详细信息的交易,但如果我搜索位置或任何其他与元相关的术语,它将返回来自数据库的所有交易结果。 What i'm doing wrong or how can i search corectly?我做错了什么或如何正确搜索?

Thank you!谢谢!

Solved!解决了!

This is the code that works for my case!这是适用于我的案例的代码!

$deals = Deals::where('deals_providers', $provider)->where('deal_types', $dealType)->with('meta')
        ->where(function ($query) use ($terms, $dealType) {
            $query->whereHas('meta', function ($query) use ($terms, $dealType) {
                if ($terms['location']) {
                    $query->where('location', 'like', '%' . $terms['location'] . '%');
                }
                if ($terms['price_from'] && $terms['price_to']) {
                    $query->whereBetween('price', [$terms['price_from'], $terms['price_to']]);
                }
                if ($terms['departs_from']) {
                    $query->where('departs_from', 'like', '%' . $terms['departs_from'] . '%');
                }
                if ($terms['duration']) {
                    $query->where('duration', 'like', '%' . $terms['duration'] . '%');
                }
                if ($terms['available_start']) {
                    $query->where('available_start', 'like', '%' . $terms['available_start'] . '%');
                }
                if ($terms['available_end']) {
                    $query->where('available_end', 'like', '%' . $terms['available_end'] . '%');
                }
            });
            if ($terms['title']) {
                $query->orWhere('title', 'like', '%' . $terms['title'] . '%');
            }
            if ($terms['details']) {
                $query->orWhere('details', 'like', '%' . $terms['details'], '%');
            }
        })->get();

    Debug::data($deals);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM