首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Symfony2 OneToMany关系

Symfony2 OneToMany关系
EN

Stack Overflow用户
提问于 2017-09-01 10:03:06
回答 1查看 745关注 0票数 0

我正在使用Symfony 2.5和PHP5.3做一个AdvertPlatform。

我想添加一个功能,即:当用户看到(通过点击它)一个广告,我们可以看到一个文本"Seen by : {{username}}"

我开始添加一个名为AdvertReader的新实体,它在AdvertAdvertReader之间有一个关系OneToMany

Advert.php:

代码语言:javascript
运行
复制
    /**
     * Advert
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="Society\PerfclientBundle\Entity\AdvertRepository")
     * @ORM\HasLifecycleCallbacks()
     * @UniqueEntity(fields="title", message="Une annonce existe déjà avec ce titre.")
     */        
    class Advert
    {
        public function __construct()
        {
            $this->date = new \Datetime();
        }

    /**
     *
     * @ORM\OneToMany(targetEntity="Society\PerfclientBundle\Entity\AdvertReader", mappedBy="advert", cascade={"persist"})
     */
    private $readers;


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

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date", type="datetime")
     */
    private $date;

    /**
 * @var string
 *
 * @ORM\Column(name="title", type="string", length=255, unique=true)
 *
 * @Assert\Length(min=10, minMessage="Le titre de l'annonce doit faire au moins {{ limit }} caractères.")
 */
    private $title;

    /**
     * @var string
     *
     * @ORM\Column(name="category", type="string", length=255)
     */
    private $category;

    /**
     * @var string
     *
     * @ORM\Column(name="author", type="string", length=255)
     */
    private $author;

    /**
     * @var string
     *
     * @ORM\Column(name="content", type="text")
     * @Assert\Length(min=10, minMessage="Le contenu de l'annonce doit faire au moins {{ limit }} caractères.")
     */
    private $content;

    /**
     * @ORM\Column(name="updated_at", type="datetime", nullable=true)
     */
    private $updatedAt;`

AdvertReader.php:

代码语言:javascript
运行
复制
/**
 * AdvertReader
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class AdvertReader
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Society\PerfclientBundle\Entity\Advert", inversedBy="readers")
     * @ORM\JoinColumn(name="advert_id", referencedColumnName="id")
     */
    private $advert;

    /**
     * @var string
     *
     * @ORM\Column(name="username", type="string", length=255)
     */
    private $username;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="created_at", type="datetime")
     */
    private $createdAt;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="updated_at", type="datetime")
     */
    private $updatedAt;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set advert
     *
     * @param integer $advert
     * @return AdvertReader
     */
    public function setAdvert($advert)
    {
        $this->advert = $advert;

        return $this;
    }

    /**
     * Get advert
     *
     * @return integer 
     */
    public function getAdvert()
    {
        return $this->advert;
    }

    /**
     * Set username
     *
     * @param string $username
     * @return AdvertReader
     */
    public function setUsername($username)
    {
        $this->username = $username;

        return $this;
    }

    /**
     * Get username
     *
     * @return string 
     */
    public function getUsername()
    {
        return $this->username;
    }

和我的viewAction()

代码语言:javascript
运行
复制
    /**
     * @param $id
     * @return Response
     */
    public function viewAction($id)
    {
        // On récupère le repository
        $repository = $this->getDoctrine()
            ->getManager()
            ->getRepository('SocietyPerfclientBundle:Advert')
        ;
        $advert = $repository->find($id);

        if (null === $advert) {
            throw new NotFoundHttpException("L'annonce d'id ".$id." n'existe pas.");
        }

        $securityContext = $this->container->get('security.context');
        $user = $securityContext->getToken()->getUser();

        if ($securityContext->isGranted('IS_AUTHENTICATED_FULLY')) {
            $em = $this->getDoctrine()->getManager();
            $queryBuilder = $em->createQueryBuilder();

            $query = $queryBuilder->select('count(ar.id)')
                ->from('SocietyPerfclientBundle:AdvertReader', 'ar')
                ->where('ar.advert = :advert')
                ->andWhere('ar.username = :username')
                ->setParameter('advert', $advert->getId())
                ->setParameter('username', $user->getUsername())
                ->getQuery();

            $advertReaderCount = $query->getSingleScalarResult();

            if ($advertReaderCount <= 0) {
// l'utilisateur lis pour la 1er fois
                $advertReader = new AdvertReader;
                $advertReader->setAdvert($advert->getId());
                $advertReader->setUpdatedAt(new \DateTime);
                $advertReader->setUsername($user->getUsername());
                $advertReader->setCreatedAt(new \DateTime);

                $em->persist($advertReader);
                $em->flush();
            }
        }

        return $this->render('SocietyPerfclientBundle:Default:view.html.twig', array(
            'advert' => $advert,
        ));
    }

原则:模式:验证->映射OK数据库OK

Society\PerfclientBundle\Entity\AdvertReader#advert,异常:在关联Error500上发现类型实体但期望社会\PerfclientBundle\ entity \Error500 堆栈跟踪探查器: UnitOfWork ->computeAssociationChanges (数组(‘fieldName’=>‘副词’)、'joinColumns‘=>数组(数组(’名称‘=>’副词_id‘)、’唯一‘=> false’、'nullable‘=> true、'onDelete’=>空、'columnDefinition‘=> null、'referencedColumnName’=>‘id’)、级联‘=>数组()、'inversedBy’=>‘读取器’、‘=>’en19#‘Society\PerfclientBundle\en副词’、'fetch‘#20#’2‘、'type’en21# '2','mappedBy‘=> null,'isOwningSide’=> true,'sourceEntity‘=> isCascadeRemove 'isCascadeRemove’=> false,'isCascadePersist‘=> false,'isCascadeRefresh’=> false,'isCascadeMerge‘=> false,'isCascadeDetach’=> false,‘isCascadeMerge’=> false,‘isCascadeDetach’=> false( 'id'),‘’数组(‘#’),‘数组(’id‘en28#’),‘en30#’,‘’en23#‘’),“26”)

我的实体关系怎么了?请帮助我:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-01 10:46:10

我认为问题来自于这段代码

代码语言:javascript
运行
复制
$advertReader->setAdvert($advert->getId());

试一试:

代码语言:javascript
运行
复制
$advertReader->setAdvert($advert);

教条是期待在这种关系上的对象,而不是你传递一些整数。

希望这能有所帮助。快乐编码

亚历山德鲁·科斯

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45997783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档