0

symfony 1.4 と doctrine 1.2 の古いクエリ

$user = Doctrine_Query::create()
                ->from('User.u')
                ->innerJoin('u.State s')
                ->where('u.id = ?', $id)
                ->andWhere('u.state_id = ?', $state_id)
                ->fetchOne();

symfony2 でのクエリ:

$repository = $this->getDoctrine()
->getRepository('FrontendAccountBundle:User');

$user = $repository->findBy(array(
    'activationId' => $activation_id), 
    array('state' => 3));

私のエラーが近づいています:

認識されないフィールド: 状態

何が問題ですか?

編集:再フォーマットされたコード

アップデート

ユーザーエンティティ:

namespace Frontend\AccountBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;

/**
 * User
 *
 * @ORM\Table(name="user")
 * @ORM\Entity
 */
class User implements UserInterface, \Serializable
{

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


    /**
     * @var \State
     *
     * @ORM\ManyToOne(targetEntity="State")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="state_id", referencedColumnName="id")
     * })
     */
    private $state;




    /**
     * Set activationId
     *
     * @param string $activationId
     * @return User
     */
    public function setActivationId($activationId)
    {
        $this->activationId = $activationId;

        return $this;
    }

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

    /**
     * Set state
     *
     * @param \Frontend\AccountBundle\Entity\State $state
     * @return User
     */
    public function setState(\Frontend\AccountBundle\Entity\State $state = null)
    {
        $this->state = $state;

        return $this;
    }

    /**
     * Get state
     *
     * @return \Frontend\AccountBundle\Entity\State 
     */
    public function getState()
    {
        return $this->state;
    }

    public function __construct()
    {
        $this->isActive = true;
        $this->salt = md5(uniqid(null, true));
    }

    /**
     * @inheritDoc
     */
    public function getUsername()
    {
        return $this->email;
    }
    /**
     * @see \Serializable::serialize()
     */
    public function serialize()
    {
        return serialize(array(
            $this->id,
        ));
    }

    /**
     * @see \Serializable::unserialize()
     */
    public function unserialize($serialized)
    {
        list (
            $this->id,
        ) = unserialize($serialized);
    }
}

ユーザーエンティティ:

namespace Frontend\AccountBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

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

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

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



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

    /**
     * Set state
     *
     * @param string $state
     * @return State
     */
    public function setState($state)
    {
        $this->state = $state;

        return $this;
    }

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

    /**
     * Set description
     *
     * @param string $description
     * @return State
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }
}
4

2 に答える 2

1

問題は、User エンティティの変数が「stateId」ではなく「state」であることです。データベースではなく、常にエンティティの名前を使用する必要があります。stateId は State エンティティにあるため、User から State への結合も実行する必要があります。

結合が必要な場合は、おそらく queryBuilder または DQL を使用する方がよいでしょう。

Doctrine 2 queryBuilder の結合に関する投稿: doctrine 2 query builder and join tables

Doctrine の Symfony Book のドキュメントは次のとおりです: http://symfony.com/doc/current/book/doctrine.html#entity-relationships-associations

あなたの問題に非常によく似た私のプロジェクトの例を次に示します。

    $uid = 2;
    $rep = $this->getDoctrine()->getRepository('DevondevTrackRTimeBundle:Activity');
    $q = $rep->createQueryBuilder('a')
        ->select ('a.activityId, a.startTime, a.endTime, u.username')
        ->join('a.login','u')
        ->where('u.id = :uid')
        ->setParameter('uid', $uid)
        ->getQuery();

    $acts = $q->getResult();

ユーザーテーブルから何も必要ない場合、クエリは次のように記述できます

    $uid = 2;
    $rep = $this->getDoctrine()->getRepository('DevondevTrackRTimeBundle:Activity');
    $q = $rep->createQueryBuilder('a')
        ->where('a.login = :uid')
        ->setParameter('uid', $uid)
        ->getQuery();

    $acts = $q->getResult();

これは、同じ方法で作り直されたクエリです。

    $rep = $this->getDoctrine()->getRepository('FrontendAccountBundle:User');
    $q = $rep->createQueryBuilder('u')
        ->join('u.state','s')
        ->where ('u.id = :uid')
        ->andWhere ('s.stateId = :sid')
        ->setParameters(array('uid' => $id, 'sid' => $state_id))             
        ->getQuery(); 

    $user = $q->getSingleResult();        
于 2013-01-26T13:16:51.397 に答える
0

私を少し明るくしてくれたピーターに感謝します!!!

http://symfony.com/doc/current/book/doctrineのように、symfony1.4よりもはるかに多くのコードが必要なため、symfony2(-docs)とdoctrine2からの愚かな解決策が再び必要ない場合.html#joining-to-related-records。私の解決策を試してください。

結果は次のとおりです。

        $em = $this->getDoctrine()->getEntityManager();
        $user = $em->createQuery('SELECT u FROM FrontendAccountBundle:User u
              INNER JOIN FrontendAccountBundle:State s
                WHERE
                u.activation_id=:activation_id
                and
                u.state=:state_id
                ')
            ->setParameter('activation_id', $activation_id)
            ->setParameter('state_id', 3)
            ->getSingleResult();
于 2013-01-26T18:24:25.443 に答える