学说查询崩溃



非常非常奇怪。我已经从学说中使用了这种方法数百次。我有一个简单的控制器,该控制器将ID作为参数。学说生成的查询是错误的。

/**
 * @Security("has_role('ROLE_ADMIN')")
 * @return Response
 */
public function editSellerAction($id)
{
    $em  = $this->getDoctrine()->getManager();
    $seller = $em->getRepository('SiteUserBundle:Seller')->find($id);
    // ...
    $form = $this->createForm(new SellerType(), $seller, array(
        'method' => 'POST'
    ));
    // ...
}

生成的查询是以下

[2/2] dbalexception:执行't1.id作为id2,t1.username as username3,t1.password as password4,t1.firstname as firstName5,t1.lastname as lastName6在卖方t1的位置 T0 .id =?用参数[" 2"]限制1':

sqlstate [42S22]:找不到列:1054未知列't0.id'in where子句'

丢弃的错误是有道理的,因为它在看" where t0.id"时应该查看" where t1.id"。我使用phpmyadmin尝试了T1的查询,并且可以使用。

任何想法会导致这个问题?

/**
 * Seller have access to their customer and are able to RW access to the customers
 *
 * @ORMTable("seller")
 * @ORMEntity
 * @author Michael Villeneuve
 */
class Seller extends User
{
    /**
     * @var array
     * 
     * @ORMOneToMany(targetEntity="Customer", mappedBy="seller", cascade={"persist", "remove"})
     * @ORMJoinColumn(name="seller_id", referencedColumnName="id")
     **/
    protected $customers; 
    /**
     * @var string
     *
     * @ORMColumn(name="firstname", type="string", length=255, nullable=false)
     */
    protected $firstname;
    /**
     * @var string
     *
     * @ORMColumn(name="lastname", type="string", length=255, nullable=false)
     */
    protected $lastname;
    // Other attributes and only getters/setter

/**
 *
 * @ORMEntity
 */
class User implements UserInterface
{
    /**
     * @var integer
     *
     * @ORMColumn(name="id", type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @ORMColumn(type="string", length=255, unique=true)
     */
    private $username;
    /**
     * @ORMColumn(type="string", length=64)
     */
    private $password;

我有3个扩展用户(客户,管理员和卖方)的实体。

更新链接:https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/inheritance/inheritance-mapping.html

在映射的超级类中阅读一些:http://docs.doctrine-project.org/en/latest/reference/inheritance-mapping.html。基本上,您的抽象基本用户类本身不能成为实体。

因此,将@ORM Entity线从用户类中删除。那就是表0(t0)来自的地方。

您有2个选项:

  • 第一个是创建一个abstract 用户 entity和 sasenit 所有值。如果您拥有许多具有相同行为的实体,这将很有用。我喜欢使用ID字段和一些基本方法创建BaseEntity。所有实体都可以extend,并自动具有ID。Cerad在他的回答中解释了这是如何完成的。
  • 第二个选项被称为歧视器字段。基本上,它们允许您为每个扩展实体提供一个User表和子表。您可以在官方文档中阅读有关它们的信息。

您最终使用哪一个可能取决于情况。

尝试将id字段添加到Seller实体而不是用户

/**
 * Seller have access to their customer and are able to RW access to the customers
 *
 * @ORMTable("seller")
 * @ORMEntity
 */
class Seller extends User
{
    /**
     * @var integer
     *
     * @ORMColumn(name="id", type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @var array
     * 
     * @ORMOneToMany(targetEntity="Customer", mappedBy="seller", cascade={"persist", "remove"})
     * @ORMJoinColumn(name="seller_id", referencedColumnName="id")
     **/
    protected $customers; 
    /**
     * @var string
     *
     * @ORMColumn(name="firstname", type="string", length=255, nullable=false)
     */
    protected $firstname;
    /**
     * @var string
     *
     * @ORMColumn(name="lastname", type="string", length=255, nullable=false)
     */
    protected $lastname;
    // Other attributes and only getters/setter

/**
 *
 * @ORMEntity
 * @author Michael Villeneuve<michael@panierdachat.com>
 */
class User implements UserInterface
{
    /**
     * @ORMColumn(type="string", length=255, unique=true)
     */
    private $username;
    /**
     * @ORMColumn(type="string", length=64)
     */
    private $password;

最新更新