我有两个实体(用户和产品),一对多的关系。我想检索所有与特定用户通过一个称为“已完成”字段筛选它们产品的实体。我会公布这些实体的相关信息:
用户实体:
/**
* @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;
}
}
谢谢你的帮助
解决的办法之一是使用一个数据库查询这样的: - 控制器,你可以做
<?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,
]);
}
}
请注意,由该请求:这是一个解决方案的尝试。