Каков наиболее эффективный способ поиска отношений OneToMany с использованием доктрины в Symfony 4? - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть две сущности (Пользователь и Продукт) с отношением OneToMany.Я хочу получить все сущности Продукта, связанные с конкретным Пользователем, отфильтровав их с помощью поля «Закончено».Я опубликую соответствующую информацию об этих организациях:

Объект пользователя:

/**
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 */
class User implements UserInterface
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Product", mappedBy="user")
     */
    private $products;


    ....

Объект продукта:

/**
 * @ORM\Entity(repositoryClass="App\Repository\Productepository")
 */
class Product
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="products")
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;

    /**
     * @ORM\Column(type="boolean")
     */
    private $finished;


    ....

Я использую следующий код для фильтрации своих продуктов, но есть ли другой, более эффективный способ сделать это?

$user = $this->getUser();
$products = $user->getProducts();
$filtered = [];

foreach ($products as $product){
    if(!$product->getFinished()){
        $filtered[] = $product;
    }
}

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 03 февраля 2019

Одним из решений было бы использование запроса к базе данных, например, следующего: - в контроллере вы можете сделать

<?php

namespace App\Controller\ProductController;

use App\Repository\ProductRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;

class ProductController extends AbstractController
{
   /**
     * @Route("/products", methods={"GET"}, name="app_get_products")
     * @IsGranted("IS_AUTHENTICATED_REMEMBERED")
     */
    public function listProduct(ProductRepository $repository)
    {
        $user = $this->getUser();
        $products = $repository->findBy([
            'user' => $user,
            'finished' => false
        ]);

        return $this->render('Product/list.html.twig', [
            'products' => $products,
        ]);
    }
}

Обратите внимание на сделанный запрос: это попытка решения.

...