没有关系的Symfony实体

时间:2016-02-15 13:36:47

标签: symfony doctrine entity relational

我使用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。

感谢您的帮助:)

3 个答案:

答案 0 :(得分:2)

查看序列化。

通过序列化您的实体,您可以选择在渲染时排除或公开实体的属性。

查看Symfony built-in Serializer和/或JMSSerializer

否则,您可以使用QueryBuilderDQL选择要在查询中提取的字段。

像这样,您可以在实体的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;
}