• Doctrine2-完整创建数据库


    ---恢复内容开始---

    下面用Doctrine2设置配置一个数据库,具体分为以下步骤

    1.设计主要字段和表

    2.配置symfony2和数据库的连接

    3.配置Entity,定义类

    4.实现get/set/Reposistory

    5.生成数据库

    先记录一个坑

    这里在配置entity时,执行命令php app/console generate:doctrine:entities ScourgenWebBundle会有错误产生

    [DoctrineCommonAnnotationsAnnotationException]
    [Semantical Error] The annotation "@DoctrineORMMappingGenerateValue" in property ScourgenWebBundleEntityuser:
    :$id does not exist, or could not be auto-loaded.

    可以经过检查明明是,$id明明定义了,查阅各种资料无果,最后尝试将protect $id放在ID的annoation之前,就成功了,不太明白原理,反正是个坑吧,

    网上目前也没有搜索到解决方法。但是这样子就可以了,希望遇到同样问题的朋友可以这样子解决,欢迎讨论其中原理。这样子不行,之后还是会有错误,,,,,等我再搜索搜索

    .............原来是一个简单的地方拼写错误导致无法识别,佛了!!!!!!!!!!!!!!之前成功是因为跳过了id字段,

     

     

    1.第一步,设计主要字段和表,如图

    昨天晚上写完忘记保存了,,,,,,,这里简单来说一下表之间的关系吧

    user和profile   一对一关系

    user和book   多对多关系

    book 和category  多对多关系

    book和author  多对一关系

    author和category 一对多关系

    2.设计数据库和symfony的连接,

    这一步很简单,就是改变symfony项目当中app/config/php文件之中的参数即可,改为本地mysql数据库参数

    3.配置Entity,定义类

    首先说一下我对这一步的理解,实质上来讲就是将数据库当中的表映射为php的类,这样子,我们来在操作数据库时,需要进行各种sql语句的书写,但是如果映射到类,各种操作就可变为

    直接对一个对象进行操作,调用各种方法,doctrine会帮我们自动生成sql语句,操作数据库,这样就可极大的提高开发效率。并且在创建表时,我们也是只需要定义php的各种类,之后进行

    php app/console doctrine:generate:entities 以及doctrine:schema:update 命令更新数据库,这样就会自动在数据库当中生成表。生成之前,可以用 dectrine:schema:validate检查annoatation

    是否正确,以便后续更新数据库。

    接下来先对deoctrineORMMapping  的一对一,一对多,多对多,加入表等模块进行学习,之后运用进行entity的配置

    这里附上doctrine的官方文档之中关于working with Object

    https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/working-with-objects.html#  

    下面用代码进行简单的说明

    use DoctrineORMMappingOneToOne;
    use DoctrineORMMappingManyToMany;
    use DoctrineORMMapping as ORM;
    //剩下的模块导入类似,这里不再说说明
    /** 
     *设置生成的repository的名字,这里绝对路径,前面要用namespace
     *@ORMEntity(repositoryClass="AuthorRepository")
     *@ORMTable(name="author")   数据库当中表的名字
    */
    class Author{
    /**
     *@ORMId    说明是主键
     *@ORMColumn(type="integer")   说明字段类型
    */
      protected $id;  
    /**
     *@Column(type="string")   定义普通的字段只需说明类型
    */
     protected $name;
    /**
     *@OneToMany(targetEntity="Book",mappedBy="author") 
        一对多关系,指向目标entity,mappedBy参数代表映射字段,
        
    */
     protected $books;
    }

    下面演示book_entity,即多对一关系和多对多关系的书写方法

    //use 同上,省去
    /**
     *@ORMEntity(repositoyClass="BookRepository")
     *@ORMTable(name="book")   同上
    */
    
    class Book{
       //这里不进行重复演示    
       /**
        *多对一关系,和author当中的books对应,由于多对一关系
        *所以需要在多的那个表当中添加外键,指向一表的id字段(JoinColumn)
        *@ManyToOne(targetEntity="Author",inversedBy="books")
      *@JoinColumn(name="author_id",referencedColumnName="id")
        */
        protected $author;
        /**
    *多对多关系,category和book,JoinTable()加入一个新表进行连接,JoinColumns和inverseJoinClolumns设定新表当中的字段,也可以不设置,
    *自动生成,这里需要注意inversedBy和mappedBy,这边用了inversedBy,与之对应的ManyToMany就需要用mappedBy,并且在inversedBy这边JoinTable,
    *ManyToMany(targetEntity="Category",inversedBy="books")
    *JoinTable(name="books_categories",
    *joinColumns={@JoinColumn(name="book_id", referencedColumnName="id")},
    *inverseJoinColumns={@JoinColumn(name="category_id", referencedColumnName="id")}
    )
    */
      private $categories; } class Category{
    /**多对多关系的另一面,使用mappedBy
       *@ManyToMany(targetEntity="Book",mappedBy="categories") 
      */
      private $books;
    }

    这里基本说明完了三种对应关系,除此之外,由于存在一对多和多对多关系,所以有一些属性是以数组的形式存在的,这里使用ArrayCollection数组比array更高级,可以即时更新(简单理解,具体网上查)

    use DoctrineCommonCollectionsArrayCollection;

     这样就需要书写构造函数

    public function __construt(){
        $this->books = new ArrayCollection();
       //其他数组类似
    }

    接下来第一步构造的表关系就可以进行Entity的定义了,需要注意annoation当中的拼写细节等,可以用doctrine:schema:validate进行验证

    4.生成repositoryClass很简单,只需要在entity之前加上annoation即可,这样在执行entities命令时就会自动生成repository文件,以便后续书写该Entity的其他自定义方法

    5.生成数据库也很简单,doctrine:schema:update   命令(前面都要加上php app/console)

  • 相关阅读:
    LINUX内核参数调优集锦
    性能测试基础-开门篇3(LR常用函数介绍)
    高并发WEB服务的演变
    数据链路层学习之LLDP
    Win8.1 Metro应用无法联网终极解决方法
    Win8.1 Metro应用无法联网,提示“无法加载此页面”解决方法!(看红色字体部分)
    SecureCrt脚本(三)二级对象之Screen详解
    SecureCrt自动化
    Python数据类型一:数字与运算符
    高阶函数
  • 原文地址:https://www.cnblogs.com/eenio/p/10482599.html
Copyright © 2020-2023  润新知