非常非常奇怪。我已经从学说中使用了这种方法数百次。我有一个简单的控制器,该控制器将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;