【问题标题】:Symfony one to many dql querySymfony 一对多 dql 查询
【发布时间】:2016-07-24 09:42:10
【问题描述】:

我正在创建 symfony 网络应用程序,但在对收件箱进行适当的 dql 查询时遇到问题。 这是导致问题的实体代码:

class Message
{
/**
 * @ORM\Column(type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @OneToOne(targetEntity="User")
 * @JoinColumn(name="fromUser", referencedColumnName="id")
 */
protected $fromUser;

/**
 * @ORM\Column(type="text")
 */
protected $fromEmail;

/**
 * @return mixed
 */

/**
 * @OneToOne(targetEntity="User")
 * @JoinColumn(name="toUser", referencedColumnName="id")
 */
protected $toUser;


/**
 * @ORM\Column(type="text",length=255)
 */
protected $subject;

/**
 * @ORM\Column(type="datetimetz")
 */
protected $date;



/**
 * @ORM\Column(type="text")
 */
protected $toEmail;

/**
 * @ORM\Column(type="text")
 */
protected $content;


/**
 * @ORM\Column(type="boolean")
 */
protected $sent;


/**
 * @ORM\Column(type="boolean")
 */
protected $spammed;

/**
 * @ManyToMany(targetEntity="View")
 * @JoinTable(name="messages_views",
 *      joinColumns={@JoinColumn(name="message_id", referencedColumnName="id")},
 *      inverseJoinColumns={@JoinColumn(name="view_id", referencedColumnName="id", unique=true)}
 *      )
 */
protected $view;



class View extends CollectionType

{
public function __construct($user)
{
    $this->user = $user;
    $this->trashed = false;
    $this->deleted = false;
    $this->seen = false;
}


/**
 * @ORM\Column(type="boolean")
 */
protected $trashed;

/**
 * @ORM\Column(type="boolean")
 */
protected $deleted;

/**
 * @ORM\Column(type="boolean")
 */
protected $seen;

/**
 * @ManyToOne(targetEntity="User")
 * @JoinColumn(name="user_id", referencedColumnName="id")
 */
protected $user;
}

$view 是类 ArrayCollection() 和一对多关系。 我想选择字段“where $toUser = :me”,其中包含 $view where $view->user = :me and $view->trashed = false”(如果有两个 $view's(不可能/预期)选择第一个找到) 提前感谢您的宝贵时间。

编辑: 目前我有这样的事情

  $get = $this->getEntityManager()
        ->createQuery('
            SELECT m
            FROM MonoAdminBundle:Message m
            WHERE m.userTo = :me AND m.sent = true 
            AND 
            ORDER BY m.date DESC
        ')
        ->setParameter('me', $me->getId())->getArrayResult();
    $ret = new \Doctrine\Common\Collections\ArrayCollection();
    foreach ($get as $message) {
        if ($message->getSpammed() === false) {
            foreach ($message->getView() as $view) {
                if ($view->getUser() == $me) {
                    if ($view->getTrashed() === false) {
                        $ret->add($message);
                    }
                }
            }
        }

    }

但这不是一个好主意,因为我想使用分页器。

【问题讨论】:

    标签: php symfony one-to-many dql


    【解决方案1】:

    尝试使用 queryBuilder。

    $qb = $entityManager->getRepository(Message::class)->createQueryBuilder('m');
    $qb->addWhere('m.toUser = :me')
       ->innerJoin('m.view', v)
       ->addWhere('v.user = :me')
       ->addWhere('v.trashed = :isTrashed')
       ->setParameter('me', $user)
       ->setParameter('isTrashed', false);
    

    获取 DQL:

    $qb->getQuery()->getDQL();
    

    然后得到结果:

    $qb->getQuery()->getResults();
    

    【讨论】:

    • 感谢您的帮助 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多