I create an Entity by using commandline php app/console generate:doctrine:entity.
Now I want to delete that Entity(yml, schema..). I delete Doctrine yml file and Entity directory but when I use command line doctrine:schemal:create that always create Table which name = that Entity in Database?
To delete a generated entity, please delete the yml that contains the schema, which is located in BundleName/Resources/config/doctrine/entityName.orm.yml file. Then, delete the entityName.php in BundleName/Entities/ and clear the cache using
php app/console cache:clear
after removing the entity and clearing the cache try this command : doctrine:schema:update --force --complete
Related
So .. i create two entities from console
Then i type php bin/console doctrine:schema:update and get "No metadata Classes to process. (i already tried everything who found)
Then try to debug with php bin/console doctrine:mapping:info and get this:
Any ideas?
parameters.yml:
config.yml:
I want to change a table from order to shop_order. First I alter the table name in phpmyadmin.
Furthermore I would have guessed, that changing the annotations would be sufficient:
/**
* Order
*
* #ORM\Table(name="shop_order")
* #ORM\Entity
*/
class Order { ...
But when running
php bin/console doctrine:schema:update --dump-sql
It tries to create the table again:
CREATE TABLE `order` (id INT AUTO_INCREMENT NOT NULL ...
Is there any other file I need to change?
Clear the cache and try to alter the table name back with phpMyAdmin again. Once it is order again then use the doctrine command:
php bin/console doctrine:schema:update --dump-sql
If you want Doctrine to execute the changes then add --force as well.
Also check your Doctrine configuration, it could be that is caching the metadata somewhere else (e.g. Memcache). You might need to clear that as well.
Doctrine caches on three levels: query cache, metadata cache and result cache. You may want to take a look at the metadata one.
doctrine:
orm:
auto_mapping: true
# each caching driver type defines its own config options
metadata_cache_driver: apc
result_cache_driver:
type: memcache
host: localhost
port: 11211
instance_class: Memcache
# the 'service' type requires to define the 'id' option too
query_cache_driver:
type: service
id: my_doctrine_common_cache_service
So, if for example yours is set to Memcache then you'll have to reset Memcache as well.
Take a look at the docs here.
try to use force, like this:
php bin/console doctrine:schema:update --force --dump-sql
And delete the cache please
If It doesn't work I advise you to use migration because seems tha doctrine doesn't recognize the change of the table name:
Generate a new migration.
Erase contents of up() and down() methods and replace them with custom SQL (ALTER TABLE ... RENAME TO ...).
Migration docs
Just change the name with DB administration tool, change the name in the entity accordingly, clear cache and you are good to go - doctrine:schema:update --dump-sql will then export no change.
I'm trying to add Doctrine on top of an existing database. I let Doctrine generate annotated entities and adjusted from there. When I try to load the entity below I get the error PHP Fatal error: Uncaught exception 'ReflectionException' with message 'Property Users\\User::$resellerID does not exist'
class User
{
/* ... */
/**
* #var \Doctrine\Common\Collections\Collection
*
* #ORM\ManyToOne(targetEntity="\Resellers\Reseller")
* #ORM\JoinTable(name="reseller",
* joinColumns={
* #ORM\JoinColumn(name="resellerID", referencedColumnName="resellerID")
* },
* inverseJoinColumns={
* #ORM\JoinColumn(name="resellerID", referencedColumnName="resellerID")
* }
* )
*/
private $reseller;
/* ... */
}
Both the user and reseller tables have resellerID columns. My understanding is that for joining ID columns you don't add the ID columns as properties in the entity class. So what's causing the ReflectionException?
Since I had renamed the autogenerated property from resellerID to reseller (after trying to use it) it turns out I needed to clear the Doctrine cache.
php vendor/bin/doctrine.php orm:clear-cache:result
php vendor/bin/doctrine.php orm:clear-cache:query
php vendor/bin/doctrine.php orm:clear-cache:metadata
Or, if you are using Symfony with Doctrine:
php bin/console doctrine:cache:clear-result
php bin/console doctrine:cache:clear-query
php bin/console doctrine:cache:clear-metadata
For me clearing the PHP APC cache was the solution
<?php
apc_clear_cache();
Anyway, it helped me
php artisan doctrine:clear:metadata:cache
Usually on production you want something like this:
php bin/console doctrine:cache:clear-result --env=prod
php bin/console doctrine:cache:clear-query --env=prod
php bin/console doctrine:cache:clear-metadata --env=prod
My error still occurred when I attempted to clear the doctrine cache.
What worked for me was to manually clear the cache by deleting the folder under /storage/framework/cache/*
In Symfony, due to Docker container permissions, I had to manually delete everything under /var/cache/.
If anyone is reading this while using a Docker container:
Use Terminal within your PHP/Symfony container.
Enter the doctrine cache clear commands referenced in older answers:
php bin/console doctrine:cache:clear-result
php bin/console doctrine:cache:clear-query
php bin/console doctrine:cache:clear-metadata
Do the APC cache clear also referenced in older answers:
php -r "apc_clear_cache();"
Restart your PHP / Symfony container in Docker.
The restart as a last step ends up clearing whatever is lingering, at least in my case. Hope this helps anyone else using Docker.
I am trying to create an entity using yml and I am getting the following error:
[ErrorException]
Warning: class_parents(): Class Ambience does not exist and could not be loaded in C:\wamp\www\demo\vendor\gedmo-doctrine-extensions\lib\Gedmo\Mapping\ExtensionMetadataFactory.php line 80
I have created a file named Entities.UserTestDelete.dcm.yml in FooBundle/Resources/config/doctrine/metadata/orm
Contents of file:
Entities\UserTestDelete:
type: entity
table: users
id:
id:
type: integer
generator:
strategy: AUTO
fields:
name:
type: string
length: 50
Then I executed the following command:
php app/console doctrine:mapping:import "DemoFooBundle" yml
And then I got the error. Any idea why would that be a problem?
Just had the same problem ... and managed to solve ...
a var_dump($this) on __contruct of the exception class, in my case:
Symfony\Component\Debug\Exception\ContextErrorException
got me the $message->$trace, which led me to:
vendor/sylius/resource-bundle/EventListener/LoadORMMetadataSubscriber.php
calling function "class_parents"
in function "setAssociationMappings"
So quick fix is to simply comment out the subscribed event:
/**
* #return array
*/
public function getSubscribedEvents()
{
// return array(
// 'loadClassMetadata',
// );
}
now when running "app/console doctrine:mapping:import" again ... there won't be anymore errors ...
also if needed, run the mapping:convert and generate:entities command before enabling / uncommenting the subscribed Event again ...
If you are not using Sylius, try var_dump'ing on your exception class ... there's a good chance you too got some Eventlistner interfering with Doctrine's Import command ...
good luck!
Update
Your first mistake is that you created the yml file. As explained in the cookbook, the doctrine:mapping:import command actually generates the file. Ditch yours, run the command, and let doctrine generate the file itself.
What you do afterwards, is generate the actual entity classes:
php app/console doctrine:mapping:convert annotation ./src
php app/console doctrine:generate:entities DemoFooBundle
If the tables themselves don't exist yet, then you can use these last 2 commands to generate the entities, and then run
php app/console doctrine:schema:update --force
To have doctrine create the tables for you.
A quick look in the cookbook tells me that the bundle name should not be quoted, and that you might want to pass the --force flag to the doctrine:mapping:import command.
It's in the reverse-engineering bit
php app/console doctrine:mapping:import --force DemoFooBundle yml
That's the example Symfony2 cookbook gives, only changed to take yml, instead of xml format.
The error message could also be related to the table name:
table: users
Where the entity is called
class Users
{}
possible related question
Is it possible to generate a single entity from database using the Symfony2 console tool?
In the middle of coding I had to add a table and there are modifications made to the existing entity classes. So I don't want all my entities regenerated.
Any suggestions will be appreciated!
I had the same problem, you've to do this way:
php app/console doctrine:mapping:convert metadata_format \
./src/App/MyBundle/Resources/config/doctrine \
--from-database \
--filter="Yourtablename"
Then
php app/console doctrine:mapping:import AppMyBundle \
metadata_format --filter="Yourtablename"
Where metadata_format is the file ending you want to generate (e.g. xml, yml, annotation)
And finally
php app/console doctrine:generate:entities AppMyBundle --no-backup
Like this doctrine will load only the entity you need. Just be carefull on the filter you must use the CamelCase !
Hope this will help you
For the third command, doctrine kept regenerating all of the Entity files. By adding the entity name after the bundle, it only generated the entity I was interested in.
php app/console doctrine:generate:entities AppMyBundle:Yourtablename --no-backup
Simple Working Solution for Symfony 2.7 option annotation and for [/xml/yml] see http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html
do 3 commands in 3 steps:
$ php app/console doctrine:mapping:import --force AppBundle xml --filter="Meeting"
(NOTE: if your database name is my_meeting You will need to change it to MyMeeting in filter="MyMeeting" for doctrine to find your table name. This is because doctrine will always strip underscores and add Camel-case to your table name. If not, you will get this error: "Database does not have any mapping information".)
$ php app/console doctrine:mapping:convert annotation ./src/AppBundle/Entity --from-database --filter="Meeting"
(NOTE: making sure you have namespace AppBundle\Entity; as below in your Meeting.php class file like this:
<?php
/**
* Created by PhpStorm.
* User:
* Date: 03-Sep-2015
* Time: 3:23 PM
*/
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
If not add it in.)
where:
AppBundle is exactly your "AppBundle" in Symfony 2.7
Meeting is the target table (Camel-Case sensitive)
TO BE SURE, check this directory:
src\AppBundle/Resources/config/doctrine/Meeting.orm.xml
AND MAKING SURE you only have .xml files for the table you want to create entity class files and no others. Then run this below command to generate get and set methods for your entity class that you created previously
$ php app/console doctrine:generate:entities AppBundle:Meeting --no-backup
NOTE2:
As the last step you must delete the xml doctrine orm db file in for example src\AppBundle/Resources/config/doctrine/VisitorData.orm.xml
It works very well for me.
For explanation please read: http://symfony.com/doc/current/cookbook/doctrine/reverse_engineering.html
#fyrye's comment that is currently hidden deserves the credit, wanted to add this so it's not missed by others. This is the approach:
/** #var \Doctrine\DBAL\Connection $connection */
$config = $connection->getConfiguration();
// for excluding an specific table
$config->setFilterSchemaAssetsExpression('/^(table_to_reverse_engineer_1|table_to_reverse_engineer_2).*$/');
source: https://coderwall.com/p/jofhdw/doctrine-tell-which-tables-to-work-with
I was having issues when running the following command because of large number of badly defined legacy tables
php ./vendor/bin/doctrine orm:convert-mapping --force --from-database annotation ./src/UI/Entity/
It turns out that the --filter flag only filters AFTER it has read meta data from all of your tables which, if they don't have primary keys or have some other issue, will cause the command to fail
None of the answers were quite right for me using Symfony 3. I ended up doing:
php bin/console doctrine:mapping:import --force MyBundle xml --filter="MyTable"
php bin/console doctrine:mapping:convert annotation ./src --filter="MyTable"
php bin/console doctrine:generate:entities MyBundle:MyTable --path ./src
I would have left this as a comment to the accepted answer but I'm a newbie.
For those like me who had trouble with the --filter switch mapping multiple tables with coincident strings in names, one can use a pattern.
Example table names:
Vendor
VendorContact
php app/console doctrine:mapping:convert metadata_format \
./src/App/MyBundle/Resources/config/doctrine \
--from-database \
--filter="Vendor"
That command will convert both tables rather than just Vendor. If you want just Vendor and not VendorContact, use a pattern in --filter:
php app/console doctrine:mapping:convert metadata_format \
./src/App/MyBundle/Resources/config/doctrine \
--from-database \
--filter="\bVendor\b"
Hope that helps someone!
Works great with Symfony 3 too.
If you are getting "No Metadata Classes to process." message try convert your tablename to Doctrine camel casing in the filter parameter.
"my_table_name" needs to be write as "MyTableName".
--filter works with entity name, not table name !
php bin/console doctrine:mapping:import "App\Entity" annotation --path=config/doctrine --filter="YourEntity"
for Symfony 3
To generate the entities for a new "Group" table
php bin/console doctrine:mapping:import "App\Entity" annotation --path=src/AppBundle/Entity --filter Group
as written in the symfony 3 documentation
I had exactly the same issue with Symfony 2.4 and MySQL.
None of the workarounds posted above worked for me.
I ended up creating a new database with the tables I want to extract (this can be easy to do because MySQL provides the creation script).
Then changed the connection to that new database and executed the entity extraction command from there.
Seems to be a bit radical, but I will not create the entities by hand.
Hope that helps
Didn't work any of these for my symfony 3.3. So I just created a copy of directory and re-generated all of the entities in copy directory. Then I copied required entities in my original directory.
--filter does not work due to this issue https://github.com/symfony/symfony/issues/7717
Since 2019 doctrine has deprecated the reserve-engineering functionality, and it is therefore not recommended to use it any more. Instead, Symfony recommends to use make:entity from the Symfony Maker Bundle instead.