Php Doctrine2 ORM OneToOne不工作更新更改为ManyToMany但不完全工作

Php Doctrine2 ORM OneToOne不工作更新更改为ManyToMany但不完全工作,php,doctrine-orm,Php,Doctrine Orm,我有两个名为广告和用户的表格。用户Id被写入广告表。我现在创建了第三个表,名为Bookmark。这个表有两列,广告id和用户id。当我看到我喜欢的广告时,我可以添加一个书签,以便在我的私人部分更容易找到它。当我在我的私人部分查看我的书签时,我希望立即查看广告的详细信息,因此在我的存储库中,我希望创建一个连接来读取广告表中的信息。我以为这将是一种一刀切的关系。我还必须确保,如果广告被删除,那么所有的书签都需要删除,所以我认为这是一种双向关系。因此,我有以下建议: Entity/Bookmark.p

我有两个名为广告和用户的表格。用户Id被写入广告表。我现在创建了第三个表,名为Bookmark。这个表有两列,广告id和用户id。当我看到我喜欢的广告时,我可以添加一个书签,以便在我的私人部分更容易找到它。当我在我的私人部分查看我的书签时,我希望立即查看广告的详细信息,因此在我的存储库中,我希望创建一个连接来读取广告表中的信息。我以为这将是一种一刀切的关系。我还必须确保,如果广告被删除,那么所有的书签都需要删除,所以我认为这是一种双向关系。因此,我有以下建议:

Entity/Bookmark.php

 /**
 * Bookmark
 *
 * @ORM\Table(name="bookmark")
 * @ORM\Entity(repositoryClass="Advert\Repository\BookmarkRepository")
 */
class Bookmark
{
 /**
 * @var integer
 * @ORM\Id
 * @ORM\Column(name="advert_id", type="integer", nullable=false)
 * @ORM\OneToOne(targetEntity="Advert", mappedBy="bookmark")
 * @ORM\JoinColumn(name="advert_id", referencedColumnName="id")
 */
 private $advertId;

/**
 * @var integer
 * @ORM\Id
 * @ORM\Column(name="user_id", type="integer", nullable=false)
 * @ORM\OneToOne(targetEntity="User")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 */
 private $userId;


 public function setAdvertId($advertId)
 {
    $this->advertId = $advertId;
    return $this;
 }


 public function getAdvertId()
 {
    return $this->advertId;
 }


 public function setUserId($userId)
 {
    $this->userId = $userId;
    return $this;
 }


 public function getUserId()
 {
    return $this->userId;
 }
/** Advert
 * 
 * @ORM\Table(name="advert")
 * @ORM\Entity(repositoryClass="Advert\Repository\AdvertRepository")
 */

class Advert
{
  /**
   * @var integer
   *
   * @ORM\Column(name="id", type="integer", nullable=false)
   * @ORM\Id
   * @ORM\GeneratedValue(strategy="IDENTITY")
   */
    private $id;

 /**
   * @ORM\OneToOne(targetEntity="Bookmark", inversedBy="advert")
   * @ORM\JoinColumn(name="id", referencedColumnName="advert_id")
   **/
    private $bookmark;

public function setBookmark($bookmark)
{
    $this->bookmark = $bookmark;
    return $this;
}


public function getBookmark()
{
    return $this->bookmark;
}



public function addBookmark($bookmark)
{
    $this->bookmark->add($bookmark);
}


public function removeBookmark($bookmark)
{
    $this->bookmark->removeElement($bookmark);   
}
class BookmarkRepository extends EntityRepository
{
  public function getBookmarksByUserIds($userId)
  {
    $query =$this->_em->getRepository($this->getEntityName())->createQueryBuilder('b')
                            ->join('b.advertId', 'a')
                            ->andWhere('a.userId=:userid')
                            ->setParameter('userid',$userId)       
            ;
    return $query->getQuery()->getResult();
  }
public function watchlistAction()
{
    $user_id = $this->zfcUserAuthentication()->getIdentity()->getId();
    $adverts = $this->getEntityManager()->getRepository('Advert\Entity\User')->findBookmarksByUserId($user_id);
        return new ViewModel(array(
            'adverts' => $adverts,
        ));
}
class UserRepository extends EntityRepository
{

  public function findBookmarksByUserId($userId)
  {
      $query =$this->_em->getRepository($this->getEntityName())->createQueryBuilder('b')
                            ->join('b.bookmarks', 'a')
                            ->join('b.adverts', 'c')
                ->andWhere('a.user=:userid')
                ->setParameter('userid',$userId)       
            ;
      return $query->getQuery()->getResult();
  }
public function watchlistAction()
{
        $user_id = $this->zfcUserAuthentication()->getIdentity()->getId();
        // get User by reference (no queries executed)
        $user = $this->getEntityManager()->getReference('Advert\Entity\User' , $user_id);
        $adverts = $user->getBookmarks();

        return new ViewModel(array(
            'adverts' => $adverts,
        ));
}
Entity\Advert.php

 /**
 * Bookmark
 *
 * @ORM\Table(name="bookmark")
 * @ORM\Entity(repositoryClass="Advert\Repository\BookmarkRepository")
 */
class Bookmark
{
 /**
 * @var integer
 * @ORM\Id
 * @ORM\Column(name="advert_id", type="integer", nullable=false)
 * @ORM\OneToOne(targetEntity="Advert", mappedBy="bookmark")
 * @ORM\JoinColumn(name="advert_id", referencedColumnName="id")
 */
 private $advertId;

/**
 * @var integer
 * @ORM\Id
 * @ORM\Column(name="user_id", type="integer", nullable=false)
 * @ORM\OneToOne(targetEntity="User")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 */
 private $userId;


 public function setAdvertId($advertId)
 {
    $this->advertId = $advertId;
    return $this;
 }


 public function getAdvertId()
 {
    return $this->advertId;
 }


 public function setUserId($userId)
 {
    $this->userId = $userId;
    return $this;
 }


 public function getUserId()
 {
    return $this->userId;
 }
/** Advert
 * 
 * @ORM\Table(name="advert")
 * @ORM\Entity(repositoryClass="Advert\Repository\AdvertRepository")
 */

class Advert
{
  /**
   * @var integer
   *
   * @ORM\Column(name="id", type="integer", nullable=false)
   * @ORM\Id
   * @ORM\GeneratedValue(strategy="IDENTITY")
   */
    private $id;

 /**
   * @ORM\OneToOne(targetEntity="Bookmark", inversedBy="advert")
   * @ORM\JoinColumn(name="id", referencedColumnName="advert_id")
   **/
    private $bookmark;

public function setBookmark($bookmark)
{
    $this->bookmark = $bookmark;
    return $this;
}


public function getBookmark()
{
    return $this->bookmark;
}



public function addBookmark($bookmark)
{
    $this->bookmark->add($bookmark);
}


public function removeBookmark($bookmark)
{
    $this->bookmark->removeElement($bookmark);   
}
class BookmarkRepository extends EntityRepository
{
  public function getBookmarksByUserIds($userId)
  {
    $query =$this->_em->getRepository($this->getEntityName())->createQueryBuilder('b')
                            ->join('b.advertId', 'a')
                            ->andWhere('a.userId=:userid')
                            ->setParameter('userid',$userId)       
            ;
    return $query->getQuery()->getResult();
  }
public function watchlistAction()
{
    $user_id = $this->zfcUserAuthentication()->getIdentity()->getId();
    $adverts = $this->getEntityManager()->getRepository('Advert\Entity\User')->findBookmarksByUserId($user_id);
        return new ViewModel(array(
            'adverts' => $adverts,
        ));
}
class UserRepository extends EntityRepository
{

  public function findBookmarksByUserId($userId)
  {
      $query =$this->_em->getRepository($this->getEntityName())->createQueryBuilder('b')
                            ->join('b.bookmarks', 'a')
                            ->join('b.adverts', 'c')
                ->andWhere('a.user=:userid')
                ->setParameter('userid',$userId)       
            ;
      return $query->getQuery()->getResult();
  }
public function watchlistAction()
{
        $user_id = $this->zfcUserAuthentication()->getIdentity()->getId();
        // get User by reference (no queries executed)
        $user = $this->getEntityManager()->getReference('Advert\Entity\User' , $user_id);
        $adverts = $user->getBookmarks();

        return new ViewModel(array(
            'adverts' => $adverts,
        ));
}
Advert\Repository\Advert\Repository.php

 /**
 * Bookmark
 *
 * @ORM\Table(name="bookmark")
 * @ORM\Entity(repositoryClass="Advert\Repository\BookmarkRepository")
 */
class Bookmark
{
 /**
 * @var integer
 * @ORM\Id
 * @ORM\Column(name="advert_id", type="integer", nullable=false)
 * @ORM\OneToOne(targetEntity="Advert", mappedBy="bookmark")
 * @ORM\JoinColumn(name="advert_id", referencedColumnName="id")
 */
 private $advertId;

/**
 * @var integer
 * @ORM\Id
 * @ORM\Column(name="user_id", type="integer", nullable=false)
 * @ORM\OneToOne(targetEntity="User")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 */
 private $userId;


 public function setAdvertId($advertId)
 {
    $this->advertId = $advertId;
    return $this;
 }


 public function getAdvertId()
 {
    return $this->advertId;
 }


 public function setUserId($userId)
 {
    $this->userId = $userId;
    return $this;
 }


 public function getUserId()
 {
    return $this->userId;
 }
/** Advert
 * 
 * @ORM\Table(name="advert")
 * @ORM\Entity(repositoryClass="Advert\Repository\AdvertRepository")
 */

class Advert
{
  /**
   * @var integer
   *
   * @ORM\Column(name="id", type="integer", nullable=false)
   * @ORM\Id
   * @ORM\GeneratedValue(strategy="IDENTITY")
   */
    private $id;

 /**
   * @ORM\OneToOne(targetEntity="Bookmark", inversedBy="advert")
   * @ORM\JoinColumn(name="id", referencedColumnName="advert_id")
   **/
    private $bookmark;

public function setBookmark($bookmark)
{
    $this->bookmark = $bookmark;
    return $this;
}


public function getBookmark()
{
    return $this->bookmark;
}



public function addBookmark($bookmark)
{
    $this->bookmark->add($bookmark);
}


public function removeBookmark($bookmark)
{
    $this->bookmark->removeElement($bookmark);   
}
class BookmarkRepository extends EntityRepository
{
  public function getBookmarksByUserIds($userId)
  {
    $query =$this->_em->getRepository($this->getEntityName())->createQueryBuilder('b')
                            ->join('b.advertId', 'a')
                            ->andWhere('a.userId=:userid')
                            ->setParameter('userid',$userId)       
            ;
    return $query->getQuery()->getResult();
  }
public function watchlistAction()
{
    $user_id = $this->zfcUserAuthentication()->getIdentity()->getId();
    $adverts = $this->getEntityManager()->getRepository('Advert\Entity\User')->findBookmarksByUserId($user_id);
        return new ViewModel(array(
            'adverts' => $adverts,
        ));
}
class UserRepository extends EntityRepository
{

  public function findBookmarksByUserId($userId)
  {
      $query =$this->_em->getRepository($this->getEntityName())->createQueryBuilder('b')
                            ->join('b.bookmarks', 'a')
                            ->join('b.adverts', 'c')
                ->andWhere('a.user=:userid')
                ->setParameter('userid',$userId)       
            ;
      return $query->getQuery()->getResult();
  }
public function watchlistAction()
{
        $user_id = $this->zfcUserAuthentication()->getIdentity()->getId();
        // get User by reference (no queries executed)
        $user = $this->getEntityManager()->getReference('Advert\Entity\User' , $user_id);
        $adverts = $user->getBookmarks();

        return new ViewModel(array(
            'adverts' => $adverts,
        ));
}
我做错了什么?我的误解在哪里?我收到错误消息:

Adverte\Entity\Bookmark没有名为advertId的关联

正如我所说,当我点击“将广告添加到书签”时,表格书签才会被填满。我需要一个连接,以便在单击“显示我的书签”时显示广告详细信息,如果广告或用户被删除,则需要从书签表中删除所有书签。这是一种单向的双向关系吗?有什么不对

下面的更新1不工作

我已经更新了下面的2个文件,但没有显示任何书签。相反,我应该看到一个书签广告列表加上广告的详细信息。我甚至还没有尝试让我的服务“书签广告”或方法来检查一个广告是否被书签再次工作。我以前让它工作过,但我想我现在真的很困惑

AdvertController.php

 /**
 * Bookmark
 *
 * @ORM\Table(name="bookmark")
 * @ORM\Entity(repositoryClass="Advert\Repository\BookmarkRepository")
 */
class Bookmark
{
 /**
 * @var integer
 * @ORM\Id
 * @ORM\Column(name="advert_id", type="integer", nullable=false)
 * @ORM\OneToOne(targetEntity="Advert", mappedBy="bookmark")
 * @ORM\JoinColumn(name="advert_id", referencedColumnName="id")
 */
 private $advertId;

/**
 * @var integer
 * @ORM\Id
 * @ORM\Column(name="user_id", type="integer", nullable=false)
 * @ORM\OneToOne(targetEntity="User")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 */
 private $userId;


 public function setAdvertId($advertId)
 {
    $this->advertId = $advertId;
    return $this;
 }


 public function getAdvertId()
 {
    return $this->advertId;
 }


 public function setUserId($userId)
 {
    $this->userId = $userId;
    return $this;
 }


 public function getUserId()
 {
    return $this->userId;
 }
/** Advert
 * 
 * @ORM\Table(name="advert")
 * @ORM\Entity(repositoryClass="Advert\Repository\AdvertRepository")
 */

class Advert
{
  /**
   * @var integer
   *
   * @ORM\Column(name="id", type="integer", nullable=false)
   * @ORM\Id
   * @ORM\GeneratedValue(strategy="IDENTITY")
   */
    private $id;

 /**
   * @ORM\OneToOne(targetEntity="Bookmark", inversedBy="advert")
   * @ORM\JoinColumn(name="id", referencedColumnName="advert_id")
   **/
    private $bookmark;

public function setBookmark($bookmark)
{
    $this->bookmark = $bookmark;
    return $this;
}


public function getBookmark()
{
    return $this->bookmark;
}



public function addBookmark($bookmark)
{
    $this->bookmark->add($bookmark);
}


public function removeBookmark($bookmark)
{
    $this->bookmark->removeElement($bookmark);   
}
class BookmarkRepository extends EntityRepository
{
  public function getBookmarksByUserIds($userId)
  {
    $query =$this->_em->getRepository($this->getEntityName())->createQueryBuilder('b')
                            ->join('b.advertId', 'a')
                            ->andWhere('a.userId=:userid')
                            ->setParameter('userid',$userId)       
            ;
    return $query->getQuery()->getResult();
  }
public function watchlistAction()
{
    $user_id = $this->zfcUserAuthentication()->getIdentity()->getId();
    $adverts = $this->getEntityManager()->getRepository('Advert\Entity\User')->findBookmarksByUserId($user_id);
        return new ViewModel(array(
            'adverts' => $adverts,
        ));
}
class UserRepository extends EntityRepository
{

  public function findBookmarksByUserId($userId)
  {
      $query =$this->_em->getRepository($this->getEntityName())->createQueryBuilder('b')
                            ->join('b.bookmarks', 'a')
                            ->join('b.adverts', 'c')
                ->andWhere('a.user=:userid')
                ->setParameter('userid',$userId)       
            ;
      return $query->getQuery()->getResult();
  }
public function watchlistAction()
{
        $user_id = $this->zfcUserAuthentication()->getIdentity()->getId();
        // get User by reference (no queries executed)
        $user = $this->getEntityManager()->getReference('Advert\Entity\User' , $user_id);
        $adverts = $user->getBookmarks();

        return new ViewModel(array(
            'adverts' => $adverts,
        ));
}
Repository\UserRepository.php

 /**
 * Bookmark
 *
 * @ORM\Table(name="bookmark")
 * @ORM\Entity(repositoryClass="Advert\Repository\BookmarkRepository")
 */
class Bookmark
{
 /**
 * @var integer
 * @ORM\Id
 * @ORM\Column(name="advert_id", type="integer", nullable=false)
 * @ORM\OneToOne(targetEntity="Advert", mappedBy="bookmark")
 * @ORM\JoinColumn(name="advert_id", referencedColumnName="id")
 */
 private $advertId;

/**
 * @var integer
 * @ORM\Id
 * @ORM\Column(name="user_id", type="integer", nullable=false)
 * @ORM\OneToOne(targetEntity="User")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 */
 private $userId;


 public function setAdvertId($advertId)
 {
    $this->advertId = $advertId;
    return $this;
 }


 public function getAdvertId()
 {
    return $this->advertId;
 }


 public function setUserId($userId)
 {
    $this->userId = $userId;
    return $this;
 }


 public function getUserId()
 {
    return $this->userId;
 }
/** Advert
 * 
 * @ORM\Table(name="advert")
 * @ORM\Entity(repositoryClass="Advert\Repository\AdvertRepository")
 */

class Advert
{
  /**
   * @var integer
   *
   * @ORM\Column(name="id", type="integer", nullable=false)
   * @ORM\Id
   * @ORM\GeneratedValue(strategy="IDENTITY")
   */
    private $id;

 /**
   * @ORM\OneToOne(targetEntity="Bookmark", inversedBy="advert")
   * @ORM\JoinColumn(name="id", referencedColumnName="advert_id")
   **/
    private $bookmark;

public function setBookmark($bookmark)
{
    $this->bookmark = $bookmark;
    return $this;
}


public function getBookmark()
{
    return $this->bookmark;
}



public function addBookmark($bookmark)
{
    $this->bookmark->add($bookmark);
}


public function removeBookmark($bookmark)
{
    $this->bookmark->removeElement($bookmark);   
}
class BookmarkRepository extends EntityRepository
{
  public function getBookmarksByUserIds($userId)
  {
    $query =$this->_em->getRepository($this->getEntityName())->createQueryBuilder('b')
                            ->join('b.advertId', 'a')
                            ->andWhere('a.userId=:userid')
                            ->setParameter('userid',$userId)       
            ;
    return $query->getQuery()->getResult();
  }
public function watchlistAction()
{
    $user_id = $this->zfcUserAuthentication()->getIdentity()->getId();
    $adverts = $this->getEntityManager()->getRepository('Advert\Entity\User')->findBookmarksByUserId($user_id);
        return new ViewModel(array(
            'adverts' => $adverts,
        ));
}
class UserRepository extends EntityRepository
{

  public function findBookmarksByUserId($userId)
  {
      $query =$this->_em->getRepository($this->getEntityName())->createQueryBuilder('b')
                            ->join('b.bookmarks', 'a')
                            ->join('b.adverts', 'c')
                ->andWhere('a.user=:userid')
                ->setParameter('userid',$userId)       
            ;
      return $query->getQuery()->getResult();
  }
public function watchlistAction()
{
        $user_id = $this->zfcUserAuthentication()->getIdentity()->getId();
        // get User by reference (no queries executed)
        $user = $this->getEntityManager()->getReference('Advert\Entity\User' , $user_id);
        $adverts = $user->getBookmarks();

        return new ViewModel(array(
            'adverts' => $adverts,
        ));
}
更新下面的第2条工作内容

你是对的,我不需要UserRepository查询,请查看书签广告列表。我只需要换个房间

AdvertController.php

 /**
 * Bookmark
 *
 * @ORM\Table(name="bookmark")
 * @ORM\Entity(repositoryClass="Advert\Repository\BookmarkRepository")
 */
class Bookmark
{
 /**
 * @var integer
 * @ORM\Id
 * @ORM\Column(name="advert_id", type="integer", nullable=false)
 * @ORM\OneToOne(targetEntity="Advert", mappedBy="bookmark")
 * @ORM\JoinColumn(name="advert_id", referencedColumnName="id")
 */
 private $advertId;

/**
 * @var integer
 * @ORM\Id
 * @ORM\Column(name="user_id", type="integer", nullable=false)
 * @ORM\OneToOne(targetEntity="User")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 */
 private $userId;


 public function setAdvertId($advertId)
 {
    $this->advertId = $advertId;
    return $this;
 }


 public function getAdvertId()
 {
    return $this->advertId;
 }


 public function setUserId($userId)
 {
    $this->userId = $userId;
    return $this;
 }


 public function getUserId()
 {
    return $this->userId;
 }
/** Advert
 * 
 * @ORM\Table(name="advert")
 * @ORM\Entity(repositoryClass="Advert\Repository\AdvertRepository")
 */

class Advert
{
  /**
   * @var integer
   *
   * @ORM\Column(name="id", type="integer", nullable=false)
   * @ORM\Id
   * @ORM\GeneratedValue(strategy="IDENTITY")
   */
    private $id;

 /**
   * @ORM\OneToOne(targetEntity="Bookmark", inversedBy="advert")
   * @ORM\JoinColumn(name="id", referencedColumnName="advert_id")
   **/
    private $bookmark;

public function setBookmark($bookmark)
{
    $this->bookmark = $bookmark;
    return $this;
}


public function getBookmark()
{
    return $this->bookmark;
}



public function addBookmark($bookmark)
{
    $this->bookmark->add($bookmark);
}


public function removeBookmark($bookmark)
{
    $this->bookmark->removeElement($bookmark);   
}
class BookmarkRepository extends EntityRepository
{
  public function getBookmarksByUserIds($userId)
  {
    $query =$this->_em->getRepository($this->getEntityName())->createQueryBuilder('b')
                            ->join('b.advertId', 'a')
                            ->andWhere('a.userId=:userid')
                            ->setParameter('userid',$userId)       
            ;
    return $query->getQuery()->getResult();
  }
public function watchlistAction()
{
    $user_id = $this->zfcUserAuthentication()->getIdentity()->getId();
    $adverts = $this->getEntityManager()->getRepository('Advert\Entity\User')->findBookmarksByUserId($user_id);
        return new ViewModel(array(
            'adverts' => $adverts,
        ));
}
class UserRepository extends EntityRepository
{

  public function findBookmarksByUserId($userId)
  {
      $query =$this->_em->getRepository($this->getEntityName())->createQueryBuilder('b')
                            ->join('b.bookmarks', 'a')
                            ->join('b.adverts', 'c')
                ->andWhere('a.user=:userid')
                ->setParameter('userid',$userId)       
            ;
      return $query->getQuery()->getResult();
  }
public function watchlistAction()
{
        $user_id = $this->zfcUserAuthentication()->getIdentity()->getId();
        // get User by reference (no queries executed)
        $user = $this->getEntityManager()->getReference('Advert\Entity\User' , $user_id);
        $adverts = $user->getBookmarks();

        return new ViewModel(array(
            'adverts' => $adverts,
        ));
}
还有一个好消息,当我删除一个广告时,书签会自动从书签数据库表中删除。现在我只需要知道如何添加书签,所以我将不得不改变我的服务。一旦我得到这个工作,我会更新这篇文章,让其他人看到

下面的更新3不工作

不幸的是,我没有得到以下3种方法在我的服务工作。显然,我现在必须选择1条记录,以检查状态(是否已添加书签)、删除书签(由AdverId定义)或添加书签(由AdverId定义)


我想答案在教程中,我一直在读,但我不完全理解它。我以前在使用bookmark实体时能够添加书签,但我不知道如何通过UserEntity添加书签。在这里,OneToOne关系是错误的选择,这意味着一个用户只能为一个广告添加书签,而一个广告只能由一个用户添加书签。因为一个用户应该能够为许多广告添加书签,并且一个广告应该由许多用户添加书签,所以您需要一个多人关系

如果使用数据库,创建映射表书签的想法是正确的。然而,您不需要将其创建为条令中的实体。您只需在名为“用户中的书签”的关联中添加广告即可显示书签广告,反之亦然:

用户实体:

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

/**
 * @ORM\ManyToMany(targetEntity="Application\Entity\Advert", inversedBy="bookmarks", cascade={"persist"})
 * @ORM\JoinTable(name="bookmarks",
 *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="advert_id", referencedColumnName="id")}
 *      )
 */
private $bookmarks;
广告实体

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

/**
 * @ORM\ManyToMany(targetEntity="Application\Entity\User", mappedBy="bookmarks", cascade={"persist"})
 * @ORM\JoinTable(name="bookmarks",
 *      joinColumns={@ORM\JoinColumn(name="advert_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}
 *      )
 */
private $bookmarks;
您可能也想阅读本文:

编辑:如何添加和删除书签

条令中的关联与字段完全不同,尽管它们都是实体中的属性。要处理书签,您可以直接在用户实体中添加或删除广告实体。例如:

$bookmarks = $user->getBookmarks();
$bookmarks[] = $advert;
这将向用户添加书签,并在您
持久化
刷新
后立即存储。为了使这更容易,您可以定义
remover
adder

使用语句:

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
以及守则:

/**
 * @param Collection $bookmarks
 */
public function addBookmarks(Collection $bookmarks)
{
    foreach ($bookmarks as $bookmark) {
        $this->bookmarks->add($bookmark);
    }
}

/**
 * @param Collection $bookmarks
 */
public function removeBookmarks(Collection $bookmarks)
{
    foreach ($bookmarks as $bookmark) {
        $this->bookmarks->removeElement($bookmark);
    }
}
您现在可以删除和添加集合中给出的广告,如下所示:

$user->addBookmarks(new ArrayCollection(array($advert)));

通常建议在许多关系中定义
adder
remover
,因为许多条令组件都需要它们,例如非常有用的DoctrineObject,DoctrineModule用于Zend 2的增强器

非常感谢。我想我之所以想到OneToOne是因为我来自“一个用户为一个广告添加书签”,所以我为书签创建了一个实体,并在我的服务中设置了书签。这完全有道理。从那以后,我想现在我必须加入广告桌。。。我将尝试你的解决方案,这是否意味着我必须删除书签实体,并以某种方式更改广告实体以添加书签?创建数据库模式是一件非常抽象的事情,我们在这里都会犯错误。是的,您可以删除书签实体,但无需更改广告实体即可添加书签。我将编辑答案,解释如何添加和删除书签感谢您的帮助!!我正在尝试实现您的解决方案,但还有一个问题,这是否意味着我也必须删除我的书签存储库?现在我犯了很多错误。我总是为每个DB表创建一个实体,外加一个存储库。我对书签的查询现在会全部进入广告库吗?这在很大程度上取决于你的查询。如果您想获取用户的书签,只需按id获取用户并调用
getBookmarks
,如果您想获取为广告添加书签的用户,只需获取该广告并执行相同操作。请记住,书签本身已经不存在了——只有用户和广告之间的链接。因为您的结构已经改变,许多查询将不再有效,我将尝试使用t