I have the following reference in my class:
/**
* #Expose
* #Groups({"personal"})
*
* #MongoDB\ReferenceMany(targetDocument="AppBundle\Document\Correspondence", cascade={"remove"})
*/
protected $archiveCorrespondences;
And I want to save this reference in my database under the name archive_correspondences
But whatever I did, doctrine always keeps it under archiveCorrespondences
I use the following:
php 7
mongodb 3.2
symfony 2.8
doctrine/mongodb-odm : dev-master
doctrine/mongodb-odm-bundle: dev-master
From the doctrine mongodb documentation I did't find any possibilities, like for #Field annotation, where you can specify name.
By some reasons I can't rename $archiveCorrespondences to $archive_correspondences in code.
I suggest you to try name property. It should work for ReferenceMany:
/**
* #Expose
* #Groups({"personal"})
*
* #MongoDB\ReferenceMany(name="archive_correspondences", targetDocument="AppBundle\Document\Correspondence", cascade={"remove"})
*/
protected $archiveCorrespondences;
Related
The original problem
The reasons, notes and members fields bellow where #ORM\Column(type="string", length=20000) which did not work because that is too long for a VARCHAR so I changed them all to #ORM\Column(type="text")
And Now
It is possible that I have misunderstood the correct way to handle migrations in productions but I can't get my database to match my entity. Running php bin/console doctrine:migrations:diff or php bin/console doctrine:schema:update --dump-sql doctrine tries to update the database to an old version of Request.php like it has been cached but even after running clear-metadata the migrations all say VARCHAR(20000) like in this sql dump after I manually changed the database:
ALTER TABLE request CHANGE reasons reasons VARCHAR(20000) NOT NULL, CHANGE notes notes VARCHAR(20000) DEFAULT NULL, CHANGE members members VARCHAR(20000) NOT NULL;
Current Request.php
namespace App\Entity;
use App\Repository\RequestRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* #ORM\Entity(repositoryClass=RequestRepository::class)
*/
class Request
{
/**
* #ORM\Id
* #ORM\GeneratedValue
* #ORM\Column(type="integer")
*/
private $id;
/**
* #ORM\Column(type="time")
* #Assert\LessThan(propertyPath="endTime", message="The booking must start before it ends")
*/
private $startTime;
/**
* #ORM\Column(type="time")
*/
private $endTime;
/**
* #ORM\Column(type="date")
*/
private $date;
/**
* #ORM\Column(type="text")
*/
private $reasons;
/**
* #ORM\Column(type="text", nullable=true)
*/
private $notes;
/**
* #ORM\Column(type="text")
*/
private $status;
/**
* #ORM\ManyToOne(targetEntity=User::class, inversedBy="requests")
* #ORM\JoinColumn(nullable=true)
*/
private $user;
/**
* #ORM\Column(type="text")
*/
private $members;
I have tried removing the Request.php entity but then doctrine gets upset that it is gone. (I do have a relational link to the user table here but it is one to many).
Changing the names of members reasons and notes worked but when I changed the names back it wanted to set them back to VARCHAR(20000). Where is it holding this info. How do I get rid of it?
Doctrine Metadata is cached. When you clear the cache (and warming it back up), symfony runs "compiler passes" that among other things read annotations to build the metadata, proxy objects, registers repositories, all this kind of stuff (obviously other doctrine-unrelated stuff as well).
Running bin/console cache:clear should solve your problems. (It also should be part of your deployment process. And unless you copy over the vendor dir as well, composer install too).
I've got entity A with two ManyToOne relations. And both join columns with same name. When I am creating query based on entity A with ResultSetMappingBuilder and setting this entity to method addRootEntityFromClassMetada it results in InvalidArgumentException The column 'created_by' conflicts with another column in the mapper..
Here is quick sample for entity A
/**
* #var B
* #ManyToOne(targetEntity="B")
* #JoinColumn(name="created_by", referencedColumnName="id")
*/
private $a;
/**
* #var C
* #ManyToOne(targetEntity="C")
* #JoinColumn(name="created_by", referencedColumnName="id")
*/
private $b;
How can I avoid to conflict? I tried almost everything that I found on stack. But there are not many problems with this.
Doctrine 2.6.1
Thanks for you answers,
Michal
I am using Gedmo extension in addition with Symfony 3.2 and Doctrine 2.5.6 and I'm encountering an issue. I can't make Gedmo\Blameable and UniqueEntity constraint work together. Indeed, the blamed field is still null at validation time. Is there any way to make it work or a possible work-around ?
Here is my entity
/**
* #UniqueEntity(
* fields={"author", "question"},
* errorPath="question",
* message="This author already has an answer for that Question"
* )
* #ORM\Entity
*/
class TextAnswer
{
/**
* #ORM\ManyToOne(targetEntity="User")
* #ORM\JoinColumn(name="user_id", referencedColumnName="id")
* #Gedmo\Blameable(on="create")
*/
private $author;
/**
* #Assert\NotNull()
* #ORM\ManyToOne(targetEntity="Question", inversedBy="textAnswers")
* #ORM\JoinColumn(name="question_id", referencedColumnName="id")
*/
private $question;
}
Thanks
EDIT : SOLUTION
Rather than manually setting the user (which removes Gedmo\Blameable interests), I created my own entity validator.
I give it doctrine and token storage as arguments so it can make a query on db to validate my criteria with the currently connected user (that will be later used by Gedmo\Blameable).
The BlameableListener is invoked during the Doctrine's flush operation, which normally happens after the entity has been validated. That's why $author is null at validation time.
The most straightforward workaround is to set $author yourself beforehand.
Can anyone advise where in the PSR standards docs it documents that there should be nothing after the variable type in class member variables?
I used PHP CodeStyle Fixer by doing the following: php-cs-fixer fix MyConsoleCommand.php
...and it removed the variable from the docblock. I have been doing this for some time now and I believed this was correct and standards-compliant.
Can anyone confirm?
/**
- * #var SiteManager $siteManager
+ * #var SiteManager
*/
private $siteManager;
/**
- * #var Registry $doctrine
+ * #var Registry
*/
private $doctrine;
By default all the levels are on and this particulair behaviour comes from the sympfony standard
phpdoc_var_without_name [symfony]
#var and #type annotations should not contain the variable name.
see https://github.com/FriendsOfPHP/PHP-CS-Fixer and search for "phpdoc_var_without_name"
if you don't want to use the Symfony standard do
php php-cs-fixer.phar fix MyConsoleCommand.php --level=psr2
hope it helps
I'm working to fix some bugs and add new features to a project already in production.
What I need to do I think is very simple for who knows Symfony2 and Doctrine but I'm newbie and I don't know how to achive what i need:
I've got an existing entity on PHP side that is associated with a table in the database.
What I need is to create another entity that has some foreign key with other table.
I've tried to create the table into database first, but I don't know how to create the associated entity in PHP ( with correct annotation pointing to the foreign keys) and how to edit the other entities that need new attribute in class.
What I've also tried is to create an annotated PHP class as this:
<?php
namespace MyProject\MyBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation\ExclusionPolicy;
use JMS\Serializer\Annotation\Groups;
use JMS\Serializer\Annotation\SerializedName;
use JMS\Serializer\Annotation\Type;
use JMS\Serializer\Annotation\VirtualProperty;
use MyProject\MyBundle\Model\ItemThumb;
/**
* #ORM\Entity
* #ORM\Table(name="wall_message_comment_answer")
*/
class WallMessageCommentAnswer {
/**
* #ORM\Id
* #ORM\Column(type="integer")
* #ORM\GeneratedValue(strategy="AUTO")
* #Groups({"user_details", "search_around"})
*/
protected $id;
/**
* #ORM\ManyToOne(targetEntity="User", inversedBy="wall_message_comments")
* #ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE")
* #Groups({})
*/
public $user;
/**
* #var WallMessage
* #ORM\ManyToOne(targetEntity="WallMessage", inversedBy="users_comments")
* #ORM\JoinColumn(name="wall_message_id", referencedColumnName="id", onDelete="CASCADE")
*/
public $wall_message;
/**
* #var WallMessage
* #ORM\OneToMany(targetEntity="WallMessageComment", mappedBy="comment_answers")
* #ORM\JoinColumn(name="wall_message_comment_id", referencedColumnName="id", onDelete="CASCADE")
*/
public $wall_message_comment;
/**
* #var string
* #ORM\Column(type="string")
* #Groups({"user_details", "search_around"})
*/
public $content;
/**
* #var int
* #ORM\Column(type="integer")
* #Groups({"user_details", "search_around"})
*/
public $timestamp;
}
and then, trying to create getter and setter, launch the command:
php app/console doctrine:generate:entities MyProjectMyBundle/Entity/WallMessageCommentAnswer
But it gives me that error:
[Symfony\Component\Debug\Exception\FatalErrorException]
Compile Error: Cannot redeclare MyProject\MyBundle\Entity\User::setDocumentNumber()
as it tries to create again other entities.
Could anyone help me?
Thanks!
Why don't you try creating Entity using php app/console doctrine:generate:entity command. This will ask you for Bundle name, Entity name and columns.
After this you'll have .php file created in specified bundle. Following this URL to manually add relationship between your current and new entity.
http://symfony.com/doc/current/book/doctrine.html#relationship-mapping-metadata
This is how you can give manyToOne relationship in Symfony usng annotations, you can switch your way to assigning this relationship. (YML or any other supported by Symfony)
/**
* #ORM\ManyToOne(targetEntity="Category", inversedBy="products")
* #ORM\JoinColumn(name="category_id", referencedColumnName="id")
*/
And specify oneToMany in target entity like this
/**
* #ORM\OneToMany(targetEntity="Product", mappedBy="category")
*/
After you're done with this run the following command to get the SQL queries of the changes.
php pap/console doctrine:schema:update --dump-sql
You'll have SQL queries output which you need to copy and run on the production environment. If your production and testing environment are same run following command.
php pap/console doctrine:schema:update --force
For above procedure you don't have the table to be created in database. Doctrine does that for you.
If you already have table created you can remove that as it's going to be created automatically when you force the schema.