Laravel在产品和关系之间进行高级搜索

时间:2019-07-16 23:02:04

标签: php laravel eloquent relationship

我是laravel的新手,并且希望使用laravel提供的关系行为。

我具有搜索功能;

关键字, 类别, 媒体类型, 艺术家, 最低和最高价格

我的表格如下(仅显示相关数据)

表:产品(型号:产品)

id -> integer (primary)
name -> string
artist -> integer
active -> boolean

表:options_products(型号:ProductOptions)

id -> integer (primary)
products_id -> integer
price -> decimal(14,2)
active -> boolean

表:类别(型号:类别)

id -> integer (primary)
parent_id -> integer
name -> string

表:category_products(产品类别模型)<-数据透视表

products_id -> integer
category_id -> integer

表格:media_type(型号:Media)

id -> integer (primary)
name -> string

产品型号

public function categories() {
    return $this->belongsToMany('App\Category');
}

public function options() {
    return $this->hasMany('App\ProductOptions');
}

ProductOptions型号:

public function mediaType()
{
    return $this->hasOne('App\Media', 'id', 'media');
}

public function product()
{
    return $this->hasOne('App\Products', 'id', 'products_id');
}

public function productsMany() {
    return $this->hasMany('App\Products', 'id', 'products_id');
}

产品类别模型:

public function products()
{
    return $this->hasOne('App\Products', 'id', 'products_id');
}

类别模型:

public function products()
{
    return $this->belongsToMany('App\Products', 'category_products');
}

public function parent()
{
    return $this->belongsTo(self::class, 'parent_id');
}

public function children()
{
    return $this->hasMany(self::class, 'parent_id', 'id');
}

对于我来说,我无法弄清楚如何将所有内容合并到搜索中,例如,如果他们选择一个类别以及最低和最高价格,因为该类别链接到产品表,并且价格在options_product中表。基本上,我需要它来搜索一个参数,几个参数或所有参数。我认为我在搜索中脱颖而出,除非找到原始查询,否则找不到答案。

我目前有一个比较冗长的例程,该例程可以处理大多数搜索选项,但是要单独处理,而不要使用最低和最高定价。例如,对于文本搜索:

文本搜索:

if ($request->exists('search')) {
        /* filter & split */
        $search = Helpers::filter_search($request->get('search'));
        $products = Products::where(function ($q) use ($search) {
            foreach ($search as $value) {
                $q->orWhere('name', 'like', "%{$value}%");
                $q->orWhere('description', 'like', "%{$value}%");
            }
        })->where('active', 1)->paginate($views_per_page)->setPath('');
        $products->appends(array(
            'search' => $request->get('search')
        ));
    }

这是获取最小/最大的例程:

if ($request->exists('min') || $request->exists('max')) {
        $min = ($request->get('min')) ?? 0.00;
        $max = ($request->get('max')) ?? null;
        $products = Products::with('options')
            ->whereHas('options', function($q) use ($min,$max) {
                $q->where('options_products.price', '>=', $min);
                if ($max) {
                    $q->where('options_products.price', '<=', $max);
                }
            })->where('active', 1)->paginate($views_per_page);

    }

辅助功能:

public static function filter_search($query)
{
    $q = preg_split('/[;,+ ]+/', $query, -1, PREG_SPLIT_NO_EMPTY);
    $q = preg_replace("/[^ \w-]/", "", $q);
    return $q;
}

所以基本上,如果需要的话,我希望能够将所有这些都放在一个查询中。因此,如果客户选择艺术家,类别,媒体,最低和/或最高价格并进行文本搜索,则会创建一个完整的查询。任何帮助,将不胜感激,谢谢

0 个答案:

没有答案