1 pièce(s) jointe(s)
QueryBuilder et table d'association
Bonjour,
Je cherche à lister tout mes produits ainsi que leurs suppléments ( qui sont eux même des produits ) , j'ai donc deux tables : Product et SuppProduct qui ressemble à ca :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| class Product
{
/**
* @ORM\Id()
* @ORM\Column(type="integer")
* @ORM\GeneratedValue()
*/
private $id;
/**
* @ORM\Column(type="string")
*/
private $name;
/**
* @ORM\Column(type="string",nullable=true)
*/
private $description;
/**
* @ORM\Column(type="bigint")
*/
private $price;
/**
* @ORM\Column(type="boolean")
*/
private $isSupp;
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Category",inversedBy="products")
*/
private $category;
/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\SupplementProduct",mappedBy="products")
*/
private $products;
/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\SupplementProduct",mappedBy="supplements",fetch="EAGER")
*/
private $supplements; |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
class SupplementProduct{
/**
* @ORM\Id() @ORM\ManyToOne(targetEntity="AppBundle\Entity\Product",inversedBy="products")
* @ORM\JoinColumn(name="product_id", referencedColumnName="id",nullable=false,unique=true)
*/
private $products;
/**
* @ORM\Id() @ORM\ManyToOne(targetEntity="AppBundle\Entity\Product",inversedBy="supplements")
* @ORM\JoinColumn(name="supplement_id", referencedColumnName="id",nullable=false,unique=true)
*/
private $supplements;
private $product_id;
private $supplement_id;
/**
* @ORM\Column(type="bigint",nullable=true)
*/
private $newPrice;
} |
Donc en BDD , je me retrouve avec une table SUppProduit : id_product,id_supp,newPrice . OK
Donc dans mon controller je fais :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| public function getAllDataAction(Request $request){
// récupere toutes les categories
$categories = $this->getDoctrine()
->getRepository(Category::class)
->findAll();
// récuperer une category dans la liste
foreach ($categories as $category){
// récuperer la liste de produits dans la category
$products = $category->getProducts();
// récuperer un produit dans la list de produits
foreach ($products as $product){
// récuperer la list de supplément associé
$listSupp = $this->getDoctrine()->getRepository(SupplementProduct::class)
->findBy([
"products" =>$product,
]);
foreach ( $listSupp as $supp){
if ($listSupp != null){
// dump($listSupp);die();
// pour chaque supplément trouver au produit on ajoute
$product->addSupplement($supp);
}
// dump($product);die();
}
}
}
return $categories;
} |
Mais le probleme c'est que de cette facon un ProduitPrincipal qui a été lié comme supplément me retourne son propre id :
Pièce jointe 349235
Je cherche à faire une requete du style :
SELECT supplement_id, new_price FROM `supplement_product` INNER JOIN products WHERE products.id= $id AND products.id = product_id
Donc j'aimerai taper uniquement sur la colonne product_id comme ca si un Product: Frite par exemple est lié en tant que supplément il ressortira pour le produit associé, mais en tant que produit principal je n'aurai pas de supplément.
Le problème c'est que au niveau objet je ne vois pas du tout comment faire ca etant donné que ma classe SuppProduct dispose de newPrice et ma table Product de $product et $supplément, j'ai du mal a faire la liaison pour arriver a un tel résultat !
Si quelqu'un est à l'aise avec ca et peux m'expliquer!