Bonjour
Depuis deux jours je suis bloqué sur une parti d'aun projet de gestion commandes.

Mes deux entity concerné :
ExBesoin.php

<?php

namespace App\Entity;

use App\Repository\ExBesoinRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity(repositoryClass=ExBesoinRepository::class)
 */
class ExBesoin
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="date")
     */
    private $date_emis;

    /**
     * @ORM\Column(type="date", nullable=true)
     */
    private $dateLivraison;

    /**
     * @ORM\Column(type="text", nullable=true)
     */
    private $note;

    /**
     * @ORM\Column(type="string", length=100)
     */
    private $accord;

    /**
     * @ORM\ManyToOne(targetEntity=Labo::class, inversedBy="exBesoins")
     */
    private $labo;

    /**
     * @ORM\OneToMany(targetEntity=BesoinAr::class, mappedBy="exBesoin", cascade={"persist", "remove"})
     * @ORM\JoinColumn(name="ex_besoin_id", referencedColumnName="id")
     */
    private $besoinArs;

    public function __construct()
    {
        $this->besoinArs = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getDateEmis(): ?\DateTimeInterface
    {
        return $this->date_emis;
    }

    public function setDateEmis(\DateTimeInterface $date_emis): self
    {
        $this->date_emis = $date_emis;

        return $this;
    }

    public function getDateLivraison(): ?\DateTimeInterface
    {
        return $this->dateLivraison;
    }

    public function setDateLivraison(\DateTimeInterface $dateLivraison): self
    {
        $this->dateLivraison = $dateLivraison;

        return $this;
    }

    public function getNote(): ?string
    {
        return $this->note;
    }

    public function setNote(string $note): self
    {
        $this->note = $note;

        return $this;
    }

    public function getAccord(): ?string
    {
        return $this->accord;
    }

    public function setAccord(string $accord): self
    {
        $this->accord = $accord;

        return $this;
    }

    public function getLabo(): ?Labo
    {
        return $this->labo;
    }

    public function setLabo(?Labo $labo): self
    {
        $this->labo = $labo;

        return $this;
    }

    /**
     * @return Collection|BesoinAr[]
     */
    public function getBesoinArs(): Collection
    {
        return $this->besoinArs;
    }

    public function addBesoinAr(BesoinAr $besoinAr): self
    {
        if (!$this->besoinArs->contains($besoinAr)) {
            $this->besoinArs[] = $besoinAr;
            $besoinAr->setExBesoin($this);
        }

        return $this;
    }

    public function removeBesoinAr(BesoinAr $besoinAr): self
    {
        if ($this->besoinArs->removeElement($besoinAr)) {
            // set the owning side to null (unless already changed)
            if ($besoinAr->getExBesoin() === $this) {
                $besoinAr->setExBesoin(null);
            }
        }

        return $this;
    }
}

BesoinAr.php

<?php

namespace App\Entity;

use App\Repository\BesoinArRepository;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass=BesoinArRepository::class)
 */
class BesoinAr
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=100)
     */
    private $quantity;

    /**
     * @ORM\ManyToOne(targetEntity=UnityAr::class, inversedBy="articles")
     */
    private $unity;

    /**
     * @ORM\ManyToOne(targetEntity=Article::class, inversedBy="besoinArs")
     */
    private $article;

    /**
     * @ORM\ManyToOne(targetEntity=ExBesoin::class, inversedBy="besoinArs", cascade={"persist", "remove"})
     * @ORM\JoinColumn(name="ex_besoin_id", referencedColumnName="id")
     */
    private $exBesoin;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getQuantity(): ?string
    {
        return $this->quantity;
    }

    public function setQuantity(string $quantity): self
    {
        $this->quantity = $quantity;

        return $this;
    }

    public function getUnity(): ?UnityAr
    {
        return $this->unity;
    }

    public function setUnity(?UnityAr $unity): self
    {
        $this->unity = $unity;

        return $this;
    }

    public function getArticle(): ?Article
    {
        return $this->article;
    }

    public function setArticle(?Article $article): self
    {
        $this->article = $article;

        return $this;
    }

    public function getExBesoin(): ?ExBesoin
    {
        return $this->exBesoin;
    }

    public function setExBesoin(?ExBesoin $exBesoin): self
    {
        $this->exBesoin = $exBesoin;

        return $this;
    }

}

ExBesoinRepository.php
la partie concerné

/**
     * @return ExBesoin[] Returns an array of ExBesoin objects
     */

    public function selectBesoin(FiltreBesoin $filtre)
    {
        $query = $this->createQueryBuilder('p');
        $query = $query
            ->select('b', 'sum(b.quantity) as qte')
            ->from(BesoinAr::class, 'b' )
            ->groupBy('b.unity', 'b.article')
        ;
        return $query
            ->getQuery()->getResult();
    }

le controleur
BesoinController.php

/**
     * @Route("/commande", name="commande_all", methods={"GET"})
     */
    public function commande(ExBesoinRepository $exBesoinRepository, Request $request): Response
    {
        $besoin = $exBesoinRepository->findFiltre();*/

        return $this->render('admin/besoin/showAll.html.twig', [
            'besoin' => $besoin,
        ]);
    }

Ma vue
showAll.html.twig

<table class="table table-striped">
    <thead class="bg-light">
        <tr>
            <th class="">Article</th>
            <th>Catégorie</th>
            <th class="center">unité</th>
        </tr>
    </thead>                    
    {% for besoins in besoin %}
        {% for article in besoins.getBesoinArs() %}
            <tbody>
                <tr>
                    <th>{{ article.article }}</th>
                    <td>{{ article.article.getCategory() }}</td>                                    
                    <td>{{ article.unity }}</td>
                </tr>
            </tbody>
        {% endfor %} 
        <tfoot>
            <th></th>
            <th style="color:red"> Totale Quantité</th>
            <th style="color:red">{{ besoins.qte }}</th>
        </tfoot>
    {% endfor %}                   
</table>    

L'objectif c'est d'afficher toutes les articles commandé sur differents bons de commandes par nom d'article et on prenons en compte l'unité (Kg) et avoir un total de quantité pour chaque article.
je ne sais pas si j'ètais assez claire dans mes explications.
Je ne sais pas si ma requette est correcte dans ce que je veux afficher, elle me retourne l'erreur :
Impossible to invoke a method ("getBesoinArs") on an array.
sur la ligne :

{% for article in besoins.getBesoinArs() %}

Je vous remercie d'avance pour votre aide.

5 réponses


othye
Auteur
Réponse acceptée

Problème résolu ,
la bonne expréssion twig :

                 {% for besoins in besoin %}
                        <tbody>

                            <tr>
                                <th>{{ besoins[0].article }}</th>
                                <td>{{ besoins[0].article.category }}</td>
                                <td>{{ besoins[0].unity }}</td>
                                <th style="color:red">{{ besoins.qte }}</th>
                            </tr>
                        </tbody>

                    {% endfor %}          

Salut,

Dans ton twig ici
{% for article in besoins.getBesoinArs() %} remplacer par {% for article in besoin.getBesoinArs() %}
besoins représente un tableau de besoin, et besoin dans la boucle représente une entité besoin qui possède la méthode que tu veux

othye
Auteur

Bonjour kevin254kl
Malheureusement ça ne fonctionne pas , ça me donnne le même message d'erreur.
Mercii

Curieux tu peux faire dans ton twig un {{ dump(besoin ) }} et regarder ce qu'il contient pour comprendre

othye
Auteur

{% for besoins in besoin %}
{{ dump(besoins) }}
{% for item in besoins %}
{{ dump(article) }}
{% endfor %}
{% endfor %}
le dump de besoin :

array:14 [▼
  0 => array:2 [▼
    0 => App\Entity\BesoinAr {#790 ▼
      -id: 32
      -quantity: "20"
      -unity: Proxies\__CG__\App\Entity\UnityAr {#784 ▶}
      -article: Proxies\__CG__\App\Entity\Article {#564 ▶}
      -exBesoin: App\Entity\ExBesoin {#572 ▶}
    }
    "qte" => "30"
  ]

le dump de besoins

App\Entity\BesoinAr {#790 ▼
  -id: 32
  -quantity: "20"
  -unity: Proxies\__CG__\App\Entity\UnityAr {#784 ▶}
  -article: Proxies\__CG__\App\Entity\Article {#564 ▶}
  -exBesoin: App\Entity\ExBesoin {#572 ▶}
}