【发布时间】:2017-11-16 19:51:00
【问题描述】:
我需要关于 queryBuilder 的教义帮助。
我在 queryBuilderMethod 中搜索,获取除少数之外的所有数据。
例如在一个表的 sql 中它是这样的:
"select * from table Where user != "a" && user != "b" && user != c [...]"
我的 symfony 应用中有 3 个实体:
用户 => 一对多 => 照片 => 一对多 => RatingsPhoto
我想获取一个尚未被当前用户评分的用户。
下面的代码:
用户
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/** @ORM\Column(name="facebook_id", type="string", length=255, nullable=true) */
protected $facebook_id;
/** @ORM\Column(name="facebook_access_token", type="string", length=255, nullable=true) */
protected $facebook_access_token;
/** @ORM\Column(name="sex_target", type="integer", nullable=true) */
protected $sex_target;
/** @ORM\Column(name="sex", type="integer", nullable=true) */
protected $sex;
/**
* @ORM\OneToMany(targetEntity="Photo", mappedBy="user")
*/
protected $photo;
/**
* @ORM\OneToMany(targetEntity="RatingsPhoto", mappedBy="userMap",
* cascade={"persist", "remove"})
*/
protected $ratingsUser;
public function __construct()
{
$this->photo = new ArrayCollection();
$this->ratingsUser = new ArrayCollection();
}
}
照片
class Photo
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="User")
* @ORM\JoinColumn(name="user", referencedColumnName="id", nullable=false)
*/
protected $user;
/**
* @ORM\OneToMany(targetEntity="RatingsPhoto", mappedBy="photoMap",
* cascade={"persist", "remove"})
*/
protected $ratingsPhoto;
/**
* @var int
*
* @ORM\Column(name="numeroPlayer", type="integer", nullable=true)
*/
protected $numeroPlayer;
/**
* @var int
*
* @ORM\Column(name="nbrChoosen", type="integer", nullable=true)
*/
protected $nbrChoosen;
/**
* @var string
*
* @ORM\Column(name="photoName", type="string", length=255, unique=true, nullable=false)
*/
protected $photoName;
/**
* @ORM\Column(type="string", length=255, nullable=false)
* @var string
*/
protected $image;
/**
* @var \DateTime
*
* @ORM\Column(name="dateAdd", type="datetime")
*/
protected $dateAdd;
/**
* Constructor
*/
public function __construct()
{
$this->ratingsPhoto = new ArrayCollection();
}
}
评分照片
类 RatingsPhoto {
public function __construct()
{
}
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="ratingsUser")
* @ORM\JoinColumn(name="user", referencedColumnName="id", nullable=false, onDelete="CASCADE")
*/
protected $userMap;
/**
* @ORM\ManyToOne(targetEntity="Photo", inversedBy="ratingsPhoto")
* @ORM\JoinColumn(name="photo", referencedColumnName="id", nullable=false, onDelete="CASCADE")
*/
protected $photoMap;
/**
* @var int
*
* @ORM\Column(name="note", type="integer", nullable=false)
*/
protected $note;
/**
* @var \DateTime
*
* @ORM\Column(name="dateNote", type="datetime", nullable=false)
*/
protected $dateNote;
请求查询我尝试过但没有用
$result = $this->getEntityManager()
->createQuery(
'SELECT p, u, r
FROM AppBundle:Photo p
LEFT JOIN p.user u
LEFT JOIN p.RatingsPhoto r
WHERE u != :user
AND r.user != :user
AND u.sex = :sex
order By Rand()'
)
->setParameters(array('user' => $user, 'sex' => $user
->getSexTarget()))
->getResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY);
【问题讨论】:
-
你不希望我们做所有的工作还是?您尝试过的查询构建器方法看起来如何?
-
当然没有 :p,我只搜索最优化的方法,在一个请求中,我可以用 2 或 3 个请求和一个循环来做到这一点,但我猜它没有优化。
-
我尝试过这样的事情:
-
请将代码添加到问题中,而不是 cmets。你可以编辑它;-)
-
啊好的,是的,我有更新 :)
标签: php symfony doctrine-orm orm symfony-3.2