0

symfony2とquerybuilderに慣れていないので、すべてのコンテナーを選択しようとしていますが、結果はログインしたユーザーがアクセスできるコンテナーのみに制限されています。

現在のコードでは、次のエラーが発生します。

注意:未定義のインデックス:/var/www/biztv_symfony/vendor/doctrine/lib/Doctrine/ORM/Query/SqlWalker.php行746のコンテナ

これが私のクエリの試みです(私はこのフォーラムサイトや他のフォーラムサイトからいくつかのオプションを試しましたが、それでも正しく理解できないようです...)

public function indexAction()
{
    //Get the requisits        
    $companyId = $this->container->get('security.context')->getToken()->getUser()->getCompany()->getId();
    $em = $this->getDoctrine()->getEntityManager();

    //Fetch the containers
    $repository = $this->getDoctrine()->getRepository('BizTVContainerManagementBundle:Container');
    $query = $repository->createQueryBuilder('c')
        ->innerJoin('c.users','u')
        ->where('c.company = :company')
        ->setParameter('company', $companyId)
        ->orderBy('c.name', 'ASC')
        ->getQuery();
    $containers = $query->getResult();

私は多対多の関係でアクセスを追跡しています。これは私のユーザーエンティティです...

<?php
// src/BizTV/UserBundle/Entity/User.php

namespace BizTV\UserBundle\Entity;

use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

use BizTV\BackendBundle\Entity\company as company;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;  

    /**
    * @var object BizTV\BackendBundle\Entity\company
    *  
    * @ORM\ManyToOne(targetEntity="BizTV\BackendBundle\Entity\company")
    * @ORM\JoinColumn(name="company", referencedColumnName="id", nullable=false)
    */
    protected $company; 

    /**
     * @ORM\ManyToMany(targetEntity="BizTV\ContainerManagementBundle\Entity\Container", inversedBy="User")
     * @ORM\JoinTable(name="access")
     */
    private $access;

    public function __construct()
    {
        parent::__construct();

        $this->access = new \Doctrine\Common\Collections\ArrayCollection();

    }
//getters and setters...

これは私のコンテナエンティティです:

<?php

namespace BizTV\ContainerManagementBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

use BizTV\UserBundle\Entity\User as user;

/**
 * BizTV\ContainerManagementBundle\Entity\Container
 *
 * @ORM\Table(name="container")
 * @ORM\Entity
 */
class Container
{

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

    /**
     * @var string $name
     * @Assert\NotBlank(message = "Du måste ange ett namn för området") 
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;
    //TODO: form handler assuring no name is used twice in same company

    /**
    * @var object BizTV\BackendBundle\Entity\company
    *  
    * @ORM\ManyToOne(targetEntity="BizTV\BackendBundle\Entity\company")
    * @ORM\JoinColumn(name="company", referencedColumnName="id", nullable=false)
    */
    protected $company; 

    /**
     * @ORM\ManyToMany(targetEntity="BizTV\UserBundle\Entity\User", mappedBy="Container")
     */
    private $users;

    public function __construct() {
        $this->users = new \Doctrine\Common\Collections\ArrayCollection();
    }
4

1 に答える 1

3

Containerエンティティでは、プロパティマッピングを指定するときに、$usersの値が重要です。クラス内の逆プロパティの名前mappedByを指定する必要があります。User

ここに、Container::$users<->がありUser::$accessます。

注釈を次のように変更します。

class User
{
    /**
     * @ORM\ManyToMany(targetEntity="BizTV\ContainerManagementBundle\Entity\Container", inversedBy="users")
     * @ORM\JoinTable(name="access")
     */
    private $access;
}

class Container
{
    /**
     * @ORM\ManyToMany(targetEntity="BizTV\UserBundle\Entity\User", mappedBy="access")
     */
    private $users;
}

アソシエーションに関するドクトリンオームのドキュメントの部分を読み、すべてのアソシエーションでこれを確認して修正することをお勧めします。

于 2012-08-18T11:00:53.980 に答える