通过船运到国家搜索产品

时间:2019-11-15 12:22:31

标签: php sql laravel

我有一个countries表,该表具有以下字段:

title: string

我有一个products表,其中包含以下字段:

title,
description
...
ship_to: longText

ship_to的格式是这样的,例如,某产品可以以IDs1020 < / p>

30

现在,我要做的是按可以运送到的国家/地区过滤产品。因此,例如,我给出了10,20个(国家/地区的ID)数组,我想找到可以运往至少一个国家/地区的产品。

但是我无法提出任何有效的方法。我正在考虑使用ship_to: {[10,20,30]}

进行foreach循环

或类似的东西,但随着时间的流逝,它会成为此过滤器查询的瓶颈。

如何解决数据库设计问题,或者为此提供隐藏的Laravel雄辩功能?我找不到能完成此任务的任何东西。

这是我写的一些代码,然后才意识到这是行不通的:

orWhereIn('ship_to', $givenArrayOfCountryIds)

我使用管道将多个过滤器合而为一。这是调用管道的代码:

<?php

namespace App\Model\Filters\Product;

use App\Model\Contracts\AbstractClasses\Filter;

class ShipsTo extends Filter
{
    protected function applyFilter($builder)
    {
        $filterName = $this->filterName();
        $shipsTo = request()->$filterName;
        if ($shipsTo && count($shipsTo) > 0) {
            return $builder->whereHas('countries', function ($query) use ($shipsTo) {
                $query->whereIn('id', $shipsTo);
            });
        }
        return $builder;
    }
}

1 个答案:

答案 0 :(得分:1)

我认为解决该问题的最佳方法是产品和国家之间的多对多关系。为了获得它,请在数据库上创建一个新表,如下所示:

CREATE TABLE products_countries(
   product_id int not null, /* or the domain of product table primary key */
   country_id int not null, /* or the domain of country table primary key */
   primary key(product_id, country_id),
   FOREIGN KEY (product_id) REFERENCES Product(id), //or the product table primary key
   FOREIGN KEY (country_id) REFERENCES Country(id), //or the product country primary key
)

,而不是产品型号上的

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

,然后再在“国家/地区”模型上:

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