Details
Description
Hi there I encountered a bug. When was trying to get ManyToMany self referencing association via lazy loading.
Here is my Entity.
use Doctrine\Common\Collections\ArrayCollection; /** * * @Table(name="Roles") * @entity(repositoryClass="Users_Model_RoleRepo") */ class Users_Model_Entity_Role extends Viscomp_Doctrine_Entity_Abstract { /** * @Id @Column(name="roleID", type="integer") * @GeneratedValue(strategy="AUTO") * */ protected $roleID; /** * @Column (name="name", type="string", length="45") * * */ protected $name; /** * @Column (name="shortName", type="string", length="45") * * */ protected $shortName; /** * @ManyToMany (targetEntity="Users_Model_Entity_Role", mappedBy="extends") */ protected $extendedBy; /** * @ManyToMany (targetEntity="Users_Model_Entity_Role", inversedBy="extendedBy") * @JoinTable (name="RoleRelations", * joinColumns={@JoinColumn(name="roleID", referencedColumnName="roleID")}, * inverseJoinColumns={@JoinColumn(name="extendsRoleID", referencedColumnName="roleID")} * ) */ protected $extends; public function __construct() { $this->extends = new ArrayCollection; $this->extendedBy = new ArrayCollection; } }
When I call
$test = $this->getEntityManager()->getRepository('Users_Model_Entity_Role')->findOneBy(array('roleID' => 3));
Doctrine\Common\Util\Debug::dump($test); die;
The SQL that is generated is :
SELECT t0.roleID AS roleID1, t0.name AS name2, t0.shortName AS shortName3 FROM Roles t0 WHERE t0.roleID = ? array(1) { [0]=> int(3) }
SELECT t0.roleID AS roleID1, t0.name AS name2, t0.shortName AS shortName3 FROM Roles t0 INNER JOIN RoleRelations ON t0.roleID = RoleRelations.roleID WHERE RoleRelations.extendsRoleID = ?
array(1) {
[0]=>
int(3)
}
SELECT t0.roleID AS roleID1, t0.name AS name2, t0.shortName AS shortName3 FROM Roles t0 INNER JOIN RoleRelations ON t0.roleID = RoleRelations.extendsRoleID WHERE t0.roleID = ?
array(1) {
[0]=>
int(3)
}
In the last SQL query there is a mistake in the where clause it should be RoleRelations.roleID = ? and not t0.roleID = ?. And because of that it is not returning correct result.
Activity
victor Velkov
made changes -
| Field | Original Value | New Value |
|---|---|---|
| Description |
Hi there I encountered a bug. When was trying to get ManyToMany self referencing association via lazy loading. Here is my Entity. {code} use Doctrine\Common\Collections\ArrayCollection; /** * * @Table(name="Roles") * @entity(repositoryClass="Users_Model_RoleRepo") */ class Users_Model_Entity_Role extends Viscomp_Doctrine_Entity_Abstract { /** * @Id @Column(name="roleID", type="integer") * @GeneratedValue(strategy="AUTO") * */ protected $roleID; /** * @Column (name="name", type="string", length="45") * * */ protected $name; /** * @Column (name="shortName", type="string", length="45") * * */ protected $shortName; /** * @ManyToMany (targetEntity="Users_Model_Entity_User", mappedBy="roles") */ protected $users; /** * @ManyToMany (targetEntity="Users_Model_Entity_Privilege", inversedBy="roles") * @JoinTable (name="RolePrivileges", * joinColumns={@JoinColumn(name="roleID", referencedColumnName="roleID")}, * inverseJoinColumns={@JoinColumn(name="privilegeID", referencedColumnName="privilegeID")} * ) */ protected $privilege; /** * @ManyToMany (targetEntity="Users_Model_Entity_Role", mappedBy="extends") */ protected $extendedBy; /** * @ManyToMany (targetEntity="Users_Model_Entity_Role", inversedBy="extendedBy") * @JoinTable (name="RoleRelations", * joinColumns={@JoinColumn(name="roleID", referencedColumnName="roleID")}, * inverseJoinColumns={@JoinColumn(name="extendsRoleID", referencedColumnName="roleID")} * ) */ protected $extends; public function __construct() { $this->extends = new ArrayCollection; $this->extendedBy = new ArrayCollection; $this->privilege = new ArrayCollection; $this->users = new ArrayCollection; } } {code} When I call {code} $test = $this->getEntityManager()->getRepository('Users_Model_Entity_Role')->findOneBy(array('roleID' => 3)); Doctrine\Common\Util\Debug::dump($test); die; {code} The SQL that is generated is : {code} SELECT t0.roleID AS roleID1, t0.name AS name2, t0.shortName AS shortName3 FROM Roles t0 WHERE t0.roleID = ? array(1) { [0]=> int(3) } SELECT t0.roleID AS roleID1, t0.name AS name2, t0.shortName AS shortName3 FROM Roles t0 INNER JOIN RoleRelations ON t0.roleID = RoleRelations.roleID WHERE RoleRelations.extendsRoleID = ? array(1) { [0]=> int(3) } SELECT t0.roleID AS roleID1, t0.name AS name2, t0.shortName AS shortName3 FROM Roles t0 INNER JOIN RoleRelations ON t0.roleID = RoleRelations.extendsRoleID WHERE t0.roleID = ? array(1) { [0]=> int(3) } {code} In the last SQL query there is a mistake in the where clause it should be RoleRelations.roleID = ? and not t0.roleID = ?. And because of that it is not returning correct result. |
Hi there I encountered a bug. When was trying to get ManyToMany self referencing association via lazy loading. Here is my Entity. {code} use Doctrine\Common\Collections\ArrayCollection; /** * * @Table(name="Roles") * @entity(repositoryClass="Users_Model_RoleRepo") */ class Users_Model_Entity_Role extends Viscomp_Doctrine_Entity_Abstract { /** * @Id @Column(name="roleID", type="integer") * @GeneratedValue(strategy="AUTO") * */ protected $roleID; /** * @Column (name="name", type="string", length="45") * * */ protected $name; /** * @Column (name="shortName", type="string", length="45") * * */ protected $shortName; /** * @ManyToMany (targetEntity="Users_Model_Entity_Role", mappedBy="extends") */ protected $extendedBy; /** * @ManyToMany (targetEntity="Users_Model_Entity_Role", inversedBy="extendedBy") * @JoinTable (name="RoleRelations", * joinColumns={@JoinColumn(name="roleID", referencedColumnName="roleID")}, * inverseJoinColumns={@JoinColumn(name="extendsRoleID", referencedColumnName="roleID")} * ) */ protected $extends; public function __construct() { $this->extends = new ArrayCollection; $this->extendedBy = new ArrayCollection; } } {code} When I call {code} $test = $this->getEntityManager()->getRepository('Users_Model_Entity_Role')->findOneBy(array('roleID' => 3)); Doctrine\Common\Util\Debug::dump($test); die; {code} The SQL that is generated is : {code} SELECT t0.roleID AS roleID1, t0.name AS name2, t0.shortName AS shortName3 FROM Roles t0 WHERE t0.roleID = ? array(1) { [0]=> int(3) } SELECT t0.roleID AS roleID1, t0.name AS name2, t0.shortName AS shortName3 FROM Roles t0 INNER JOIN RoleRelations ON t0.roleID = RoleRelations.roleID WHERE RoleRelations.extendsRoleID = ? array(1) { [0]=> int(3) } SELECT t0.roleID AS roleID1, t0.name AS name2, t0.shortName AS shortName3 FROM Roles t0 INNER JOIN RoleRelations ON t0.roleID = RoleRelations.extendsRoleID WHERE t0.roleID = ? array(1) { [0]=> int(3) } {code} In the last SQL query there is a mistake in the where clause it should be RoleRelations.roleID = ? and not t0.roleID = ?. And because of that it is not returning correct result. |
victor Velkov
made changes -
| Priority | Major [ 3 ] | Blocker [ 1 ] |
| Fix Version/s | 2.0.1 [ 10114 ] |
Benjamin Eberlei
made changes -
| Priority | Blocker [ 1 ] | Major [ 3 ] |
Benjamin Eberlei
made changes -
| Fix Version/s | 2.0.2 [ 10116 ] | |
| Fix Version/s | 2.0.1 [ 10114 ] |
Benjamin Eberlei
made changes -
| Fix Version/s | 2.0.3 [ 10117 ] | |
| Fix Version/s | 2.0.2 [ 10116 ] |
Benjamin Eberlei
made changes -
| Status | Open [ 1 ] | Resolved [ 5 ] |
| Resolution | Fixed [ 1 ] |
Benjamin Eberlei
made changes -
| Fix Version/s | 2.0.4 [ 10130 ] | |
| Fix Version/s | 2.0.3 [ 10117 ] |
Benjamin Eberlei
made changes -
| Workflow | jira [ 12310 ] | jira-feedback [ 14737 ] |
Benjamin Eberlei
made changes -
| Workflow | jira-feedback [ 14737 ] | jira-feedback2 [ 16601 ] |
Benjamin Eberlei
made changes -
| Workflow | jira-feedback2 [ 16601 ] | jira-feedback3 [ 18854 ] |
This list may be incomplete, as errors occurred whilst retrieving source from linked applications:
- Request to http://www.doctrine-project.org/fisheye/ failed: Error in remote call to 'FishEye 0 (http://www.doctrine-project.org/fisheye/)' (http://www.doctrine-project.org/fisheye) [AbstractRestCommand{path='/rest-service-fe/search-v1/crossRepositoryQuery', params={query=DDC-992, expand=changesets[-21:-1].revisions[0:29],reviews}, methodType=GET}] : Received status code 503 (Service Temporarily Unavailable)
The solution that I found is in the class BasicEntityPersister on line 1123 we have
and i replace it with
I am not sure if that is the correct answer but as far as i have tested it doesn't mess up with the normal many to many association via join table.