Hi Jasper,
When i browse into the Doctrine in /vendor/doctrine, i see the doctrine
version is 2.4.1.
I will explain you my case in detail to show you 2 'bugs' that i
encourtered :
First here is my class :
<?php
namespace Functional\BuildBundle\Entity\Unit;
use Doctrine\ORM\Mapping as ORM;
/**
*
@ORM\Entity(repositoryClass="Functional\BuildBundle\Entity\Unit\Repository\UserUnitRepository")
* @ORM\Table(name="_user_unit")
*/
class UserUnit
{
/**
* @ORM\Id
* @ORM\ManyToOne(targetEntity="Functional\UserBundle\Entity\User",
inversedBy="units")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id",
nullable=false)
*/
private $user;
/**
* @ORM\Id
*
@ORM\ManyToOne(targetEntity="Functional\BuildBundle\Entity\Unit\Unit")
* @ORM\JoinColumn(name="unit_id", referencedColumnName="id",
nullable=false)
*/
private $unit;
/**
* @ORM\Column(type="integer")
*/
private $value;
/**
* @ORM\Version
* @ORM\Column(type="integer", name="version")
*/
private $version;
[...] // get and setters after this
}
Now when i insert a first row i create it like this :
$userUnit = new UserUnit();
$unit = $this->getUnitRepository()->find($unitId);
$userUnit->setUnit($unit);
$userUnit->setUser($user);
$userUnit->setValue($quantity);
$this->getUserUnitRepository()->save($userUnit);
The save method call a persist and a flush on the entityManager.
At this moment i was a 'bug' because Doctrine try to find the default
version value to assign and there was an error (he doesn't use the id
according to the entities) :
ContextErrorException: Catchable Fatal Error: Object of class
Proxies\__CG__\Functional\BuildBundle\Entity\Unit\Unit could not be
converted to string in
C:\Developpement\wamp3\www\Systris\vendor\doctrine\dbal\lib\Doctrine\DBAL\Connection.php
line 695
1. in
C:\Developpement\wamp3\www\Systris\vendor\doctrine\dbal\lib\Doctrine\DBAL\Connection.php
line 695
2. at ErrorHandler->handle('4096', 'Object of class
Proxies\__CG__\Functional\BuildBundle\Entity\Unit\Unit could not be
converted to string',
'C:\Developpement\wamp3\www\Systris\vendor\doctrine\dbal\lib\Doctrine\DBAL\Connection.php',
'695', *array*('query' => 'SELECT version FROM _user_unit WHERE user_id
= ? AND unit_id = ?', 'params' => *array*(*object*(User), *object*(Unit)),
'types' => *array*(), 'qcp' => *null*, 'logger' => *object*(LoggerChain),
'stmt' => *object*(PDOStatement)))
3. at PDOStatement->execute(*array*(*object*(User), *object*(Unit))) in
C:\Developpement\wamp3\www\Systris\vendor\doctrine\dbal\lib\Doctrine\DBAL\Connection.php
line 695
4. at Connection->executeQuery('SELECT version FROM _user_unit WHERE
user_id = ? AND unit_id = ?', *array*(*object*(User), *object*(Unit)))
in
C:\Developpement\wamp3\www\Systris\vendor\doctrine\dbal\lib\Doctrine\DBAL\Connection.php
line 419
5. at Connection->fetchColumn('SELECT version FROM _user_unit WHERE
user_id = ? AND unit_id = ?', *array*(*object*(User), *object*(Unit)))
in
C:\Developpement\wamp3\www\Systris\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\BasicEntityPersister.php
line 336
6. at BasicEntityPersister->fetchVersionValue(*object*(ClassMetadata),
*array*('user' => *object*(User), 'unit' => *object*(Unit))) in
C:\Developpement\wamp3\www\Systris\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\BasicEntityPersister.php
line 311
7. at BasicEntityPersister->assignDefaultVersionValue(*object*(UserUnit),
*array*('user' => *object*(User), 'unit' => *object*(Unit))) in
C:\Developpement\wamp3\www\Systris\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\BasicEntityPersister.php
line 289
8. at BasicEntityPersister->executeInserts() in
C:\Developpement\wamp3\www\Systris\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php
line 952
9. at UnitOfWork->executeInserts(*object*(ClassMetadata)) in
C:\Developpement\wamp3\www\Systris\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php
line 335
10. at UnitOfWork->commit(*null*) in
C:\Developpement\wamp3\www\Systris\vendor\doctrine\orm\lib\Doctrine\ORM\EntityManager.php
line 389
11. at EntityManager->flush() in
C:\Developpement\wamp3\www\Systris\src\Technical\GeneralBundle\Entity\Repository\BaseEntityRepository.php
line 11
12. at BaseEntityRepository->save(*object*(UserUnit)) in
C:\Developpement\wamp3\www\Systris\src\Functional\BuildBundle\Service\BuildService.php
line 99
13. at BuildService->buildUnit(*object*(User), '1', '10', '0') in
C:\Developpement\wamp3\www\Systris\src\Technical\QueueBundle\Service\QueueService.php
line 214
Then i wrote a quick fix for this add a __toString method to Unit object
returning the id as string and it works.
After this i try the update one UserUnit with this code :
$userUnit = $this->getUserUnitRepository()->findOneBy(array('user' =>
$user->getId(), 'unit' => $unitId));
$unitEntityLockRunner = new UnitEntityLockRunner($quantity);
$this->getUserUnitRepository()->update($userUnit, $unitEntityLockRunner);
The $userUnit object has a field version with 0 instead of having the
correct value from database which is 1 or 2.
If you need some extra informations please tell me and if you have some
explanations i will be happy to here them ;)
Thanks.
Best regards,
David.
--
You received this message because you are subscribed to the Google Groups
"doctrine-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/doctrine-user.
For more options, visit https://groups.google.com/groups/opt_out.