【问题标题】:symfony - doctrine - Recover all the data of my bdd except a fewsymfony - 教义 - 恢复我 bdd 的所有数据,除了少数
【发布时间】: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


【解决方案1】:

只是先澄清一下。这不是 100% 正确的:

用户 => 一对多 => 照片 => 一对多 => RatingsPhoto

您所拥有的是带有附加属性的经典多对多关系,这不再是 m:n 关系,而是引入了您的专用关系实体 RatingsPhoto

所以你基本上拥有的是

用户 OneToMany> RatingsPhoto ManyToOne> 照片

除此之外,每个用户都可以拥有多张照片,这是对照片

的一种所有权

用户 OneToMany> 照片

首先提出一个小建议,将 User:photo 属性重命名为 User:photos 以反映正确的关系。

/**
 * @ORM\OneToMany(targetEntity="Photo", mappedBy="user")
 */
protected $photos;

关于您的查询:

我想获取一个尚未被当前用户评分的用户。

您应该使用子查询构建查询,例如 get all users that are not in (a list of users which photos have been rated by the current user):

您可以尝试这样的事情(未经测试):

$result = $this->getEntityManager()
    ->createQuery(
        'SELECT u
         FROM AppBundle:User u
         WHERE u.id not in 
             (
                 SELECT ru.i FROM AppBundle:RatingsPhoto r
                 LEFT JOIN u.photos p,
                 LEFT JOIN p.user ru
                 WHERE r.userMap = :user
             )
         AND u.sex = :sex
         order By Rand()'
    )
    ->setParameters(array('user' => $user, 'sex' => $user
    ->getSexTarget()))
    ->getResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY);

【讨论】:

  • 非常感谢!你的回复对我有很大帮助!我发现了一些类似的东西,我把它贴在下面。
【解决方案2】:

最后我找到了答案,如果可以帮助某人,我将代码放在下面:

$result = $queryBuilder
    ->select(['p, ru, u'])
    ->from('AppBundle:Photo', 'p')
    ->leftJoin('p.ratingsPhoto', 'ru')
    ->leftJoin('p.user', 'u')
    ->where('ru.id IS NULL')
    ->Orwhere($queryBuilder->expr()->not($queryBuilder->expr()->exists('
            SELECT sr.id
            FROM AppBundle:RatingsPhoto sr
            WHERE sr.userMap = :user'
    )))
    ->andWhere('u.sex = :sex')
    ->setParameters(array('user' => $user, 'sex' => $user->getSexTarget()))
    ->getQuery()
    ->getResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY)
;

【讨论】:

    猜你喜欢
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多