教义 Annontiation OneToOne,ManyToOne 等在 symfony 中不起作用



这对我来说很奇怪。我正在使用symfony 3并尝试创建2个具有2个不同实体的表。两者都与ManyToOne相关联。清除缓存和更新策略后,这两个字段不会链接在一起。

所以我用 2 个相似的实体做了一个简单的一对一

用户:

'/**
* @ORMEntity
* @ORMTable(name="md_user")
* @ORMEntity(repositoryClass="AppBundleRepositoryUserRepository")
*/

 class User
{
/**
     * @ORMId
     * @ORMColumn(type="integer", unique=true)
     * @AssertNotBlank()
     * @ORMGeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORMColumn(type = "integer")
     * @ORMOneToOne(targetEntity="Userdata")
     * @ORMJoinColumn(name="userdata_id", referencedColumnName="id")
     */
    protected $cid;'

用户数据:

    '/**
     * MdUser
     *
     * @ORMTable(name="md_userdata")
     * @ORMEntity(repositoryClass="AppBundleRepositoryUserdataRepository")

     */
    class  Userdata
    {
/**
* @var id
* @ORMColumn(type="integer")
* @ORMGeneratedValue(strategy="AUTO")
* @ORMId
* @ORMOneToOne(targetEntity="AppBundleEntityUser", inversedBy="cid")
*/
        protected $id;
        /**
         * @var string
         * @ORMColumn(name="last_name", type="string", length=255)
         */
        protected $last_name;
'

在symfony中更新了教义之后,没有任何变化。有人可以告诉我,我做错了什么吗?

添加了 config.yml:

'imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: services.yml }
# Put parameters here that don't need to change on each machine where the app is deployed
# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
parameters:
    locale: de
framework:
    cache:
        pools:
            app.cache.doctrine_orm:
                adapter: cache.system
    esi: ~
    translator:
       fallbacks: ['%locale%']
       paths: ['%kernel.project_dir%/app/Resources/translations']
    session:
        handler_id: SymfonyComponentHttpFoundationSessionStorageHandlerPdoSessionHandler
    secret: '%secret%'
    router:
        resource: '%kernel.project_dir%/app/config/routing.yml'
        strict_requirements: ~
    form: ~
    csrf_protection: ~
    validation:
         enable_annotations: true
         enabled: true
    #serializer: { enable_annotations: true }
    templating:
        engines: ['twig']
    default_locale: '%locale%'
    trusted_hosts: ~
    fragments: ~
    http_method_override: true
    assets: ~
#       base_path: ./../Resources/views/Frontend/
    php_errors:
        log: true
# Twig Configuration
twig:
    debug: '%kernel.debug%'
    strict_variables: '%kernel.debug%'
#    globals:
#        fos_csrf_provider: "@form.csrf_provider"
fos_user:
    db_driver: orm
    firewall_name: main
    user_class: AppBundleEntityUser
    from_email:
        address: "%mailer_user%"
        sender_name: "%mailer_user%"
knp_menu:
    #  if true, enables the helper for PHP templates
    templating: true
    # the renderer to use, list is also available by default
    default_renderer: twig
# Doctrine Configuration
doctrine:
    dbal:
        driver: pdo_mysql
        host: '%database_host%'
        port: '%database_port%'
        dbname: '%database_name%'
        user: '%database_user%'
        password: '%database_password%'
        charset: UTF8
    orm:
        auto_generate_proxy_classes: '%kernel.debug%'
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: true
        metadata_cache_driver:
                   type: service
                   id: app.doctrine_orm.cache
        result_cache_driver:
                   type: service
                   id: app.doctrine_orm.cache
        query_cache_driver:
                   type: service
                   id: app.doctrine_orm.cache
        second_level_cache:
                    enabled: true
# Swiftmailer Configuration
swiftmailer:
    transport: '%mailer_transport%'
    host: '%mailer_host%'
    username: '%mailer_user%'
    password: '%mailer_password%'
    spool: { type: memory }
# ...
assetic:
    debug:          '%kernel.debug%'
    use_controller: '%kernel.debug%'
    filters:
        cssrewrite: ~
'

服务.yml

'# Learn more about services, parameters and containers at
# https://symfony.com/doc/current/service_container.html
parameters:
    #parameter_name: value
services:
    SymfonyComponentHttpFoundationSessionStorageHandlerPdoSessionHandler:
        public:    false
        arguments:
            - 'mysql:host=%database_host%;port=%database_port%;dbname=%database_name%'
            - { db_table: md_sessions, db_username: '%database_user%', db_password: '%database_password%' }

    # default configuration for services in *this* file
    _defaults:
        # automatically injects dependencies in your services
        autowire: true
        # automatically registers your services as commands, event subscribers, etc.
        autoconfigure: true
        # this means you cannot fetch services directly from the container via $container->get()
        # if you need to do this, you can override this setting on individual services
        public: false
    # makes classes in src/AppBundle available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    AppBundle:
        resource: '../../src/AppBundle/*'
        # you can exclude directories or files
        # but if a service is unused, it's removed anyway
        exclude: '../../src/AppBundle/{Entity,Repository,Tests}'
    # controllers are imported separately to make sure they're public
    # and have a tag that allows actions to type-hint services
    AppBundleController:
        resource: '../../src/AppBundle/Controller'
        public: true
        tags: ['controller.service_arguments']

    app.session_handler:
       class: 'AppBundleEventListenerMandantListener'
       arguments: ["@doctrine.orm.entity_manager"]
       tags:
        - { name: kernel.event_listener, event: kernel.request }
    app.template_listener:
        class: 'AppBundleEventListenerTemplateListener'
        arguments: ["@twig"]
        tags:
         - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
    app.doctrine_orm.cache:
        class: SymfonyComponentCacheDoctrineProvider
        arguments: ["@app.cache.doctrine_orm"]
    app.locale_listener:
       class: 'AppBundleEventListenerLocaleSubscriber'
       arguments: ["%kernel.default_locale%"]
       tags: [kernel.event_subscriber]
'

似乎您有一个冲突的声明:不能同时自动生成列以及与另一个实体的关系。

因此,更改UserData$id以反映这一点:删除自动生成,类似于这些行:

class  Userdata
{
    /**
    * @var id
    * @ORMColumn(type="integer")
    * @ORMOneToOne(targetEntity="AppBundleEntityUser", inversedBy="cid")
    */
    protected $id;
}

。但这并不是一个好的做法,因为无论如何您都需要一个唯一的 ID。所以我会走一条不同的路线,创建一个新字段来保存该特定关系。原始 ID 将自动生成,并且您为与 cid 的关系创建一个新字段。

PS :同样,您在User上两次声明@ORMEntity。没什么大不了的,但你知道

最新更新