Symfony doctrine repository返回实体实例

时间:2017-05-04 09:38:37

标签: php symfony doctrine-orm

我有一个实体存储我打印的3D对象。

private $id;
/**
 * @ORM\Column(type="array", nullable=true)
 */
private $images;
/**
 * @ORM\Column(type="datetime")
 */
private $date_created;
/**
 * @ORM\Column(type="datetime")
 */
private $date_modified;
/**
 * @ORM\ManyToOne(targetEntity="App\UserBundle\Entity\User")
 */
private $user;
/**
 * @ORM\ManyToOne(targetEntity="App\ThreedBundle\Entity\Threedobject", cascade={"all"})
 */
private $threedobject;
/**
 * @ORM\Column(type="text", nullable=true)
 */
private $description;

有一个SQL查询,如下所示:

select threedobject_id from threed_print where user_id = {RANDOM_NUMBER} group by threedobject_id;

我必须得到$ threedobject所有实例(我的意思是App \ ThreedBundle \ Entity \ Threedobject实例),它们通过Doctrine表示以下sql查询。 我尝试了以下querybuilder,但它返回了值的数组表示,但大多数情况下我必须使用元素的方法,所以我想得到实例。

$query = $this->em->createQueryBuilder();
$result = $query
  ->select('tp')
  ->addSelect('to')
  ->from('ThreedBundle:ThreedPrint', 'tp')
  ->join('tp.threedobject', 'to')
  ->join('tp.user', 'u')
  ->where('u.id = :userID')
  ->groupby('to.id')
  ->setParameter('userID', $userID)
  ->getQuery();
return $result->getResult();

我读到了存储库查找方法,但这不是我想要的,或者我不完全理解它是如何工作的。

更新

基本上我需要的是:

$query = $this->em->createQueryBuilder();
$result = $query
  ->select('to')
  ->from('ThreedBundle:ThreedPrint', 'tp')
  ->join('tp.threedobject', 'to')
  ->join('tp.user', 'u')
  ->where('u.id = :userID')
  ->groupby('to.id')
  ->setParameter('userID', $userID)
  ->getQuery();
return $result->getResult();

但是我得到了以下错误:

'SELECT to FROM': Error: Cannot select entity through identification variables without choosing at least one root entity alias.

2 个答案:

答案 0 :(得分:0)

如果要使用存储库,则应在项目下的src(通常称为存储库)中创建一个文件夹,并创建一个带有名称的新类(例如:ThreedobjectRepository)。

然后你把以下内容放在那个类中:

namespace NameProject\NameBundle\Repository;

use Doctrine\ORM\EntityRepository;


class ThreedobjectRepository extends EntityRepository
{

function findById3D($a)
{
$query = $this->getEntityManager()
    ->createQuery("Select th.threedobject_id AS id
                               FROM NameprojectNameBundle:threed_print th
                               Where th.user_id=:user_id
                               GROUP BY threedobject_id")
                 set parameter (user_id, $a);

return $query->getResult();


}

}

不要忘记在你的threed_print.php上加上这一行:

/**
 * @ORM\Entity(repositoryClass="Nameproject\NameBundle\Repository\ThreedobjectRepository")
* @ORM\Table
*/

然后你可以转到你正在使用的控制器,而不是使用findall()或findoneby(),你只需使用你已经创建了findById3D($ a)的函数,并轻松使用你想要使用的实例。

我希望我帮助过你。

答案 1 :(得分:0)

您应该实现从Threedobject到Threedprint的反向关系oneToMany,在Threedobject中添加$ threedprints字段。

然后你可以写这个

$threedobjects=$this->em->createQueryBuilder()
->select('to')
->from('ThreedBundle:Threedobject')
->join('to.threedprints', 'tp')
->join('tp.user', 'u')
->where('u.id = :userID')
->setParameter('userID', $userID)
->getQuery()->getResult();