【问题标题】:Doctrine2 How to check if there is the related record inDoctrine2 如何检查是否有相关记录
【发布时间】:2025-12-14 10:50:01
【问题描述】:

我在这两个实体之间有一个双向多对多:

位置

/**
* Position
*
* @ORM\Table(name="applypie_position")
* @ORM\Entity(repositoryClass="Applypie\Bundle\PositionBundle\Entity\PositionRepository")
*/
class Position
{

const IS_ACTIVE = true;

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORM\ManyToMany(targetEntity="Applypie\Bundle\UserBundle\Entity\Applicant", mappedBy="bookmarks")
 */
private $bookmarkedApplicants;

申请人

/**
 * Applicant
 *
 * @ORM\Table(name="applypie_applicant")
 * @ORM\Entity
 */
class Applicant
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORM\ManyToMany(targetEntity="Applypie\Bundle\PositionBundle\Entity\Position", inversedBy="bookmarkedApplicants")
 * @ORM\JoinTable(name="applypie_user_job_bookmarks",
 *      joinColumns={@ORM\JoinColumn(name="applicant_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="position_id", referencedColumnName="id")}
 *      )
 */
private $bookmarks;

我的问题是:在通过 ID 轻松显示职位的 PositionControllers 操作中,我需要知道想要查看该职位的当前申请人是否有当前职位的书签。

我首先想到的是使用 $applicant->getBookmarks() 获取所有书签并在 forarch 中运行,根据当前位置检查所有申请人的书签,但我认为必须有更简单的方法?

谢谢

【问题讨论】:

    标签: symfony doctrine-orm many-to-many


    【解决方案1】:

    如果你想保持面向对象,你可以这样做:

    class Applicant
    {
        // fields and ORM annotations
    
        public function hasBookmark(Bookmark $bookmark) {
            return $this->bookmarks->contains($bookmark);
        }
    
    
    
    class MyController
    {
        public function testAction() {
            $applicant = $this->getUser(); // or however you fetch the applicant object
            $bookmark  = $bookmarkRepository->find($bookmarkId); // again, however you get the bookmark object
    
            // @var boolean $applicantHasBookmark
            $applicantHasBookmark = $applicant->hasBookmark($bookmark);
    
            // other controller code
        }
    

    【讨论】: