Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 加入实体的原则_Php_Symfony_Doctrine Orm - Fatal编程技术网

Php 加入实体的原则

Php 加入实体的原则,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,在查询与另一个实体有关系的实体时,我试图做出一些有效的改进 实体A: /** * @var integer * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @var string * @ORM\Column(name="name", type="string", length=225) * @Asse

在查询与另一个实体有关系的实体时,我试图做出一些有效的改进

实体A:

/**
 * @var integer
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @var string
 * @ORM\Column(name="name", type="string", length=225)
 * @Assert\NotBlank(message="Please enter a name for your profile.")
 */
protected $display_name;

/**
 * @ORM\OneToOne(targetEntity="Posts", mappedBy="profile", cascade={"all"}, fetch="LAZY")
 */
protected $posts;
实体B:

/**
 * @var integer
 * @ORM\Column(name="profile_id", type="integer")
 * @ORM\Id
 */
protected $profile_id;

/**
 * @ORM\OneToOne(targetEntity="Profile", inversedBy="posts")
 * @ORM\JoinColumn(name="profile_id", referencedColumnName="id")
 */
protected $profile;

/**
 * @var string
 * @ORM\Column(name="content", type="string")
 */
protected $content;
当我计算正在执行的查询的数量时,我得到两个,我猜being doctrine为每个实体运行两个单独的查询,即使它们之间存在关系

我目前正在获取实体A,如下所示:

public function fetchById($id)
{
    return $this->createQueryBuilder('p')
        ->where('p.id = :id')
        ->setParameter('id', $id)
        ->getQuery()
        ->getOneOrNullResult();
}
然后像这样调用实体B:

 $profile = $profileRepository->fetchById($user->getUserId());
 $lastpost = $profile->getPosts()[0];
但是我希望能够在这个查询中加入第二个实体,这样我就可以只调用一个查询而不是两个查询。我希望做这样的事情:

public function fetchById($id)
{
    return $this->createQueryBuilder('p')
        ->select('p','pp')
        ->leftJoin(Posts::class, 'pp', \Doctrine\ORM\Query\Expr\Join::WITH, 'p.id = pp.profile_id')
        ->where('p.id = :id')
        ->setParameter('id', $id)
        ->getQuery()
        ->getResults();
}
但是,左连接返回两个实体的数组。这不是我想要的,因为我希望仍然能够调用实体A中的getPosts()方法


我主要想填充实体A,包括所有相关的实体。但是,通过只执行一个查询而不是两个查询,这在理论上是可能的吗

不久前,我有一个类似的场景(不是1-1而是1-n),我这样解决:

// ...Repository
public function findAllForUserWithAll(\AppBundle\Entity\User $u)
{
    $query = $this->getEntityManager()->createQueryBuilder('ca1')
        ->add('select', 'c, s, i, m')
        ->add('from', 'AppBundle:Contact c')
        ->leftJoin('c.skills', 's')
        ->leftJoin('c.interests', 'i')
        ->leftJoin('c.metAt', 'm')
        ->where('c.user = :user')
        ->orderBy('c.lastname', 'ASC')
        ->setParameters([
            'user' => $u,
        ])
        ->getQuery();

    return $query->getResult();
}

这是在Symfony 2.8.*中使用的^2.4.8原则-结果是一个包含3个联接的查询(而不是4个查询)。也许不是最好的代码,老实说,所有的魔法都发生在引擎盖下。而且你的代码看起来很像。但这可能是由于
fetch=“LAZY”
(在实体A上)-我的实体没有这样的连接?

进行3次连接是低效的,因为f***@mike在我的情况下,它可能比运行100次查询更有效,1+(n*3)准确地说,在您的情况下,您应该有一个视图模型,可以将所有内容聚合到一个表中,针对应用程序的视图部分进行了优化。@emix这总是一种折衷,对吗?您是将开销花在通过网络进行多次调用以获取最少的数据量上,还是只进行一次调用,在DB服务器上花费更多的时间和内存,然后返回冗余数据并对其进行解析?如果联接在索引列上,则它们非常有效。