Je travaille sur un filtre pour certains produits. J'ai la majorité de cela fonctionne mais je rencontre une erreur avec une clause where
impossible.Laravel impossible où requête
La table contient plusieurs lignes pour un seul produit et j'essaie de faire correspondre plusieurs critères par produit, ce qui provoque son échec.
Si vous avez une opinion à ce sujet, ou peut-être un moyen de résoudre ce problème, je l'apprécierais grandement.
La table de base de données ressemble à ceci:
-------------------------------------------- |id | FilterKey | filterValue | product_id | -------------------------------------------- |1 | Colour | Gunmetal | 1 | |2 | Colour | Silver | 1 | |3 | Size | 750cc | 1 | |4 | Size | 1000cc | 1 | |5 | Colour | Red | 2 | |6 | Colour | Blue | 2 | |7 | Size | 750cc | 2 | |8 | Size | 1000cc | 2 | --------------------------------------------
Et le filtre ressemble à ceci:
public function scopeFilterProduct($query, $filters)
{
$this->filters = $filters;
if (count ($this->filters) === 1 && isset($this->filters[0]))
{
return $query;
}
$query->join('product_filters', 'products.id', '=', 'product_filters.product_id')->Where(function($query){
foreach ($this->filters as $filter => $vals)
{
$this->filter = $filter;
$this->vals = $vals;
$query->Where(function ($query){
$query->Where('filterKey', $this->filter);
$query->Where(function($query){
foreach ($this->vals as $val){
$query->orWhere('filterValue', $val);
}
$this->vals = null;
});
});
$this->filter = null;
};
});
return $query;
}
Cela affiche alors l'instruction SQL suivante:
select
distinct
`products`.`id`
, `product_id`
from
`products`
inner join
`product_filters`
on
`products`.`id` = `product_filters`.`product_id`
where
(
(`filterKey` = 'Colour' and (`filterValue` = 'gunmetal'))
and
(`filterKey` = 'Size' and (`filterValue` = '750cc'))
)
and
`products`.`deleted_at` is null
Si cette option est sélectionnée, comme dans la capture d'écran, seul le «produit un» doit être présent sur la page.
Ceci est appelé une logique de division.Procédé réglée à suivre est « obtenir un produit pour lequel il n'existe pas un filtre sélectionné que n'a pas " – apokryfos