我有一个实体存储我打印的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.
答案 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();