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