Doctrine ORM Custom Column Collation - symfony

I'm trying to set custom column collation as in Doctrine documentation:
http://doctrine-dbal.readthedocs.org/en/latest/reference/schema-representation.html and
http://doctrine-orm.readthedocs.org/en/latest/reference/annotations-reference.html
using
#ORM\Column(name="body", type="string", length=140, options={"customSchemaOptions"={"collate"="utf8mb4_unicode_ci"}})
but when I update the schema it always goes back to utf8_unicode_ci (when I set it manually for example). Any ideas?

This has been added by now if you (or someone else) still need, see column annotation docs
Example: In annotations:
/**
* #var string
*
* #ORM\Column(type="string", length=64, nullable=false, options={"collation":"utf8_bin"})
*/
private $code;
In Yaml:
Your\Nice\Entity:
fields:
code:
type: string
length: 64
options:
collation: utf8_bin # Although the recommendation is the utf8mb4* set now.
This is supported by all common database drivers now.

Related

Doctrine is generating "DEFAULT NULL" columns, even nullable=false is specified

We migrated the configuration from yml to annotations. In the best case if we do doctrine:schema:update --dump-sql there are no modifications. But now doctrine generates SQL "DEFAULT NULL" on all existing not nullable columns.
We tried to set explicitly nullable=false. And also we tried to move this column property from embeddable to main entity. Nothing works properly.
Table already existing. If we have this annotation
/**
* #ORM\Column(name="first_name", type="string", length="255", nullable=false)
*/
protected $firstName;
doctrine generates:
ALTER TABLE user CHANGE first_name first_name VARCHAR(255) DEFAULT NULL;

symfony2 doctrine decimal precision scale annotations are ignored

i've set up an attribute in my entity like this :
/**
* #var decimal
*
* #ORM\Column(name="latitude", type="decimal", precision=10, scale=7, nullable=true)
*/
private $latitude;
but when i generate the database schema with : doctrine:database:create; doctrine:schema:create
my field is set up to decimal (10,0) in the database (when i look up with phpmyadmin)
and so, when in insert data like 42.123456 with a form, this data is truncated to 42.
how can i resolve this?
Thanks.
Ok, finally get to resolve this.
Simply manually remove the cache (app/cache/..)
removing it by symfony command cache:clear wont revolve the problem

Symfony2 & FOSRestBundle: Getting UUID packed in a BINARY(16) field from MySQL

I am facing a weird problem relating to UUIDs.
I have developed a REST API using Symfony2+FOSRestBundle+JMSSerializer. As I need to update some tables from two sources I thought of using UUID as primary key for one entity.
I did a doctrine:mapping:import to generate entities in my Symfony project. Everything correct. I ended up with the following entity (only exposing the key field and generated getter for simplicity):
<?php
namespace Stardigita\TgaAPIBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* TgaBookings
*
* #ORM\Table(name="tga_bookings", indexes={[...]})
* #ORM\Entity
*/
class TgaBookings
{
/**
* #var string
*
* #ORM\Column(name="book_cd_booking_UUID", type="blob", length=16, nullable=false)
* #ORM\Id
* #ORM\GeneratedValue(strategy="IDENTITY")
*/
private $bookCdBookingUuid;
/**
* Get bookCdBookingUuid
*
* #return string
*/
public function getBookCdBookingUuid()
{
return $this->bookCdBookingUuid;
}
...
No setter was generated. I can still do it myself and I will, as I will need to know the key beforehand.
The data for this field is correctly stored in the table as a BINARY(16). When I recover the data calling the REST GET method, I get this:
[
{
"book_cd_booking_uuid": "Resource id #1244",
"book_cd_booking": 8,
....
My question is: how can I get the actual data from the field?
I suppose something has to be done in the field getter, but I tried some solutions without any success.
Thanks.
UPDATE:
I've managed to get the actual data logged, modifying the getBookCdBookingUuid method this way:
/**
* Get bookCdBookingUuid
*
* #return string
*/
public function getBookCdBookingUuid()
{
return bin2hex($this->bookCdBookingUuid);
}
and changed the type to "guid" in the property annotation:
/**
* #var string
*
* #ORM\Column(name="book_cd_booking_UUID", type="guid", length=16, nullable=false)
* #ORM\Id
* #ORM\GeneratedValue(strategy="IDENTITY")
*/
private $bookCdBookingUuid;
I have represented the hex UUID correctly in the log before returning the results in the controller:
[2014-11-03 19:52:07] app.ERROR: 1046684e5f6711e4a09f00089bce936a [] []
But still getting an exception relating UTF invalid characters:
request.CRITICAL: Uncaught PHP Exception RuntimeException: "Your data could not be encoded because it contains invalid UTF8 characters." at /var/www/tga_api/vendor/jms/serializer/src/JMS/Serializer/JsonSerializationVisitor.php line 36 {"exception":"[object] (RuntimeException: Your data could not be encoded because it contains invalid UTF8 characters. at /var/www/tga_api/vendor/jms/serializer/src/JMS/Serializer/JsonSerializationVisitor.php:36)"} []
Also I got no response from the service. A 500 error is returned.
Please, I need to solve this issue. Any ideas are welcome.
Thanks.
GeneratedValue
I notice you're using the annotation #ORM\GeneratedValue(strategy="IDENTITY") for the UUID property. IDENTITY means the database should/will use auto-increments, which shouldn't be done when using UUIDs. Please change it to #ORM\GeneratedValue(strategy="NONE") or remove it completely.
Conversion
The string form of a UUID (like 01234567-89ab-cdef-0123-456789abcdef) should be converted to binary when it's persisted in the database, and converted back when fetched from the database.
The easiest way to do this is to introduce a custom type. See here for an example.
Bugs
Doctrine (even master/2.5) has some issues with using UUIDs in associations. I'm attempting to fix these issues in PR #1178.
If you need UUIDs in associations and can't wait till it's fixed, then use regular integer ids and have the UUID is a separate column.

No 'binary' type with Doctrine 2.4.4

I'm trying to use the binary type of Doctrine 2.4.4 using Symfony 2.5.1 as shown in the Doctrine documentation:
http://doctrine-dbal.readthedocs.org/en/latest/reference/types.html#binary
With this code:
<?php
/**
* #ORM\Table(name="admins")
* #ORM\Entity(repositoryClass="SG\AdminBundle\Entity\AdminRepository")
*/
class Admin
{
/**
* #ORM\Column(name="id", type="integer")
* #ORM\Id
* #ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* #ORM\Column(name="email", type="string", length=255, unique=true)
*/
private $email;
/**
* #ORM\Column(name="password", type="binary", length=64, options={"fixed" = true})
*/
private $password;
}
And I get this error while executing the command doctrine:schema:update --dump-sql:
[Doctrine\DBAL\DBALException]
Unknown column type "binary" requested. Any Doctrine type that you use has to be registered with \Doctrine\DBAL\Types\Type::addType(). You can get a list of all the known types with \Doctrine\DBAL\Types\Type::getTypesMap(). If this error occurs during database introspection then you might have forgot to register all database types for a Doctrine Type. Use AbstractPlatform#registerDoctrineTypeMapping() or have your custom types implement Type#getMappedDatabaseTypes(). If the type name is empty you might have a problem with the cache or forgot some mapping information.
When I check the Doctrine sources at ./vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/, there is no such binary type.
In fact binary type is available since v2.5.0 only: "introduce BinaryType" commit on github
If you check the doctrine website, you need Doctrine DBAL v2.4.2 (at least) in order to use the binary type.
What is your Doctrine DBAL version?

doctrine2 date/datetime as ID

is it possible to set an attribute as an id when the column is date or datetime?`
Here my Attribute in the entity:
/**
* #var date $statisticdate
*
* #ORM\Column(name="statisticdate", type="date", nullable=false, unique=true)
* #Id
* #Assert\DateTime()
*/
private $statisticdate;
When i'm persisting a new object, i have an error that the object Datetime cannot be converted to string.
Now i created a normal id attribut and everything works.
Thank you very much.
Asfar as I know, it is only allowed in a composite key, and even that is has some known issues. I think the easy solution can be to make it a string and let the setStaticdate($datetime) check wheather it is a valid date or not.

Resources