我使用Symfony2和Doctrine,我对实体有疑问。
在性能方面的担忧中,我想知道是否有可能在不进行所有关联的情况下使用实体?
目前,我还没有找到另一种方法来创建一个继承具有关联的类的模型,并且关联在继承的类中指定NULL。
提前谢谢
好的,一点点细节,它是用于API REST(JSON)。
这是我的班级:
/**
* Offerequipment
*
* @ORM\Table(name="offer_equipment")
* @ORM\Entity(repositoryClass="Charlotte\OfferBundle\Repository\Offerequipment")
*/
class Offerequipment
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Charlotte\OfferBundle\Entity\Offer")
* @ORM\JoinColumn(name="offer_id", referencedColumnName="id")
*/
private $offer;
/**
* @ORM\ManyToOne(targetEntity="Charlotte\ProductBundle\Entity\Equipment")
* @ORM\JoinColumn(name="equipment_id", referencedColumnName="id")
*/
private $equipment;
/**
* @VirtualProperty
*
* @return String
*/
public function getExample()
{
return $something;
}
使用QueryBuilder方法,我无法获取虚拟属性或getter。
感谢您的帮助:)
答案 0 :(得分:2)
查看序列化。
通过序列化您的实体,您可以选择在渲染时排除或公开实体的属性。
查看Symfony built-in Serializer和/或JMSSerializer。
否则,您可以使用QueryBuilder
和DQL
选择要在查询中提取的字段。
像这样,您可以在实体的find
中制作自己的Repository
方法。
// src/AcmeBundle/Repository/FooRepository
class FooRepository extends \Doctrine\ORM\EntityRepository
// ...
public function find($id) {
$queryBuilder = $this->createQueryBuilder('e')
->select('e.fieldA', 'e.fieldB') // selected fields
->where('e.id = :id') // where statement on 'id'
->setParameter('id', $id);
$query = $queryBuilder->getQuery();
$result = $query->getResult();
}
// ...
}
不要忘记在相应的Repository
中定义Entity
。
/**
* Foo.
*
* @ORM\Entity(repositoryClass="AcmeBundle\Repository\FooRepository")
*/
class Foo
{
// ...
}
答案 1 :(得分:2)
默认情况下,Doctrine不会自动获取实体中的所有关联,除非您将每个关联明确指定为OneToOne
或除非您使用npm ERR! EINVAL: invalid argument, rename 'D:\home\site\wwwroot\node_modules\azure_util\node_modules\pkgcloud\node_modules\gcloud\node_modules\gapitoken\node_modules\jws\node_modules\base64url\node_modules\meow\node_modules\indent-string\node_modules\repeating\node_modules\is-finite\node_modules\number-is-nan' -> 'D:\home\site\wwwroot\node_modules\number-is-nan'
关联。因此,如果您想要消除JOIN,您可以使用默认状态下的Doctrine,它不会自动加入任何内容。
但是,这不会减轻您的所有性能问题。比如说,例如,您在一个页面上显示应用程序中的50个产品的列表,并且您希望显示其可能的折扣,其中折扣是您的产品实体上的关联。除非您在查询中明确加入折扣实体,否则Doctrine将创建50个额外查询以检索折扣数据。
基本上,Symfony探查器将成为您的朋友并在您应该加入查询实体时向您显示 - 不要只是认为因为您没有自动加入关联,您的表现总会更好
答案 2 :(得分:1)
最后,经过很多天,我找到了只选择一个实体的解决方案。
找到VirtualProperties:)
public function findAllByOffer($parameters)
{
$queryBuilder = $this->createQueryBuilder('oe');
$queryBuilder->select('oe, equipment');
$queryBuilder->join('oe.equipment', 'equipment');
$result = $queryBuilder->getQuery()->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true)->getResult();
return $result;
}