【问题标题】:Symfony 2 doctrine one-to-many relational mapping stumpedSymfony 2 学说一对多关系映射难倒
【发布时间】:2013-11-27 15:03:25
【问题描述】:

我收到一个错误“错误:调用未定义的方法 Login\LogBundle\Entity\User::getToken()” 当尝试从另一个实体 apiuserdetails 获取数据时。 user_id 是 apiuserdetails 中的外键。我一直在关注示例http://symfony.com/doc/current/book/doctrine.html 关系映射模型。我可以使用 getRepository("LoginLogBundle:UserApiProfile") 从用户实体获取信息,但是如果按照他们的描述反向执行,我会收到错误消息。我在映射上做错了,但看不到它。将不胜感激一些帮助谢谢。

控制器代码是

     namespace Login\LogBundle\Controller;
     use Symfony\Bundle\FrameworkBundle\Controller\Controller;
     use Symfony\Component\HttpFoundation\Request;
     use Login\LogBundle\Entity\User;
     use Login\LogBundle\Entity\UserApiDetails;
     use Symfony\Component\Validator\Validation;
     use Symfony\Component\Validator\Constraints as Assert;

    class DefaultController extends Controller
    {

     public function userprofileAction(Request $request) {



     if ($request->getMethod()=='POST') {

    $name=$request->get('name');

    $em = $this->getDoctrine()->getManager();

    $repository = $em->getRepository("LoginLogBundle:User");

    $user = $repository->findOneBy(array('username'=>$name));


    return $this->render('LoginLogBundle:Default:userprofile.html.twig',array('token'  => $user->getToken()));        

    }
    }

    else {
       return $this->render('LoginLogBundle:Default:userprofile.html.twig');  
    }


 }

}

实体 - 用户

        namespace Login\LogBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity(repositoryClass="Login\LogBundle\Entity\Repository\UserRepository")
 * @ORM\Table(name="user")
 * @ORM\HasLifecycleCallbacks()
 *
 * User
 */
class User{
    /**
     * @var string
     */
    private $password;

    /**
     * @var string
     */
    private $name;

    /**
     * @var string
     */
    private $username;

    /**
     * @var integer
     */
    private $id;

    /**
     * @ORM\OneToMany(targetEntity="UserApiDetails", mappedBy="User")
     */
    protected $userapidetails;

    public function __construct()
    {
        $this->userapidetails = new ArrayCollection();
    }

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

        return $this;
    }

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

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

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */

    public function getName()
    {
        return $this->name;
    }

    /**
     * Set username
     *
     * @param string $username
     * @return User
     */

    public function setUsername($username)
    {
        $this->username = $username;

        return $this;
    }

    /**
     * Get username
     *
     * @return string 
     */

    public function getUsername()
    {
        return $this->username;
    }

    /**
     * Get id
     *
     * @return integer 
     */

    public function getId()
    {
        return $this->id;
    }
}

实体 - ApiUserDetails

        namespace Login\LogBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="Login\LogBundle\Entity\Repository    \UserApiDetailsRepository")
 * @ORM\Table(name="user_api_details")
 * @ORM\HasLifecycleCallbacks()
 * 
 * UserApiDetails
 */
class UserApiDetails{
    /**
     * @var string
     */
    private $apiScheme;

    /**
     * @var string
     */
    private $apiUrl;

    /**
     * @var string
     */
    private $token;

    /**
     * @var string
     */
    private $tokenSecret;

    /**
     * @var integer
     */
    private $apiId;

    /**
     * @var \Login\LogBundle\Entity\User
     *
     * @ORM\ManyToOne(targetEntity="User",inversedBy="userapidetails")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */ 
    protected $user;

    /**
     * Set apiScheme
     *
     * @param string $apiScheme
     * @return UserApiDetails
     */
    public function setApiScheme($apiScheme)
    {
        $this->apiScheme = $apiScheme;

        return $this;
    }

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

    /**
     * Set apiUrl
     *
     * @param string $apiUrl
     * @return UserApiDetails
     */
    public function setApiUrl($apiUrl)
    {
        $this->apiUrl = $apiUrl;

        return $this;
    }

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

    /**
     * Set token
     *
     * @param string $token
     * @return UserApiDetails
     */
    public function setToken($token)
    {
        $this->token = $token;

        return $this;
    }

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

    /**
     * Set tokenSecret
     *
     * @param string $tokenSecret
     * @return UserApiDetails
     */
    public function setTokenSecret($tokenSecret)
    {
        $this->tokenSecret = $tokenSecret;

        return $this;
    }

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

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

    /**
     * Set user
     *
     * @param \Login\LogBundle\Entity\User $user
     * @return UserApiDetails
     */
    public function setUser(\Login\LogBundle\Entity\User $user = null)
    {
        $this->user = $user;

        return $this;
    }

    /**
     * Get user
     *
     * @return \Login\LogBundle\Entity\User 
     */
    public function getUser()
    {
        return $this->user;
    }
}

【问题讨论】:

    标签: symfony doctrine


    【解决方案1】:

    如果您收到 \Login\LogBundle\Entity\User,则您没有 setToken 并在错误消息中说明。而且,由于您没有\Login\LogBundle\Entity\UserApiDetails 的导航属性,事实上,如果您朝这个方向前进,您就会被卡住。要么您拥有来自User 的导航属性,以获取(单个或列表)UserApiDetails,或者您获取UserApiDetails 并使用导航属性来获取User 信息。在最后一种情况下,您可以简单地在树枝中使用{{ userapi.user.token }}

    【讨论】:

    • 我认为你提到的导航属性如下所示,或者你能给我正确的代码吗 /** * @ORM\OneToMany(targetEntity="UserApiDetails", mappedBy="User") * / 受保护的 $userapidetails;公共函数 __construct() { $this->userapidetails = new ArrayCollection(); } @saamorim
    • 如果必须显式实现 userapidetails 的访问器,如 getUserapidetails()setUserapidetails(UserApiDetails $userapidetails) 以便在 api 中使用导航。无论如何,请记住你得到了一个 userapidetails 数组,所以要小心树枝中的那个,因为 {{user.userapidetails}} 将返回一个数组。
    • 谢谢我们慢慢来,我不知道如何在树枝中渲染这个数组 我在控制器中这样做 return $this->render('LoginLogBundle:Default:userprofile.html .twig',array('details' => $user->getUserapidetails()));然后在树枝 {%for find in details%} {{ find.token }} {%endfor%} 一无所获@saamorim
    • 做一个 {{ dump(details) }} 看看树枝返回什么,然后从那里开始。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多