最新消息:文章中包含代码时,请遵守代码高亮规范!

Symfony doctrine-fixtures-bundle内置数据库数据 (原创)

PHP Jay 3211浏览

官方文档:http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html(此文只是冰上一角,需要了解更多请点击)

相关链接:

IT985博客 > Symfony2 > Symfony2之在doctrine中内置数据【原创】

 

执行语句:

php app/console doctrine:fixtures:load

执行之后会删除全部内置数据表的数据,重新添加,所以在重新插入数据的时候把原来的表删除然后用

php app/console doctrine:schema:update --force

重新生成表结构,如果有必要的话可以删除数据库重新创建,具体语句请参照Databases and Doctrine

下面是具体的实现过程:

1:引入包

在项目根目录中的 composer.json 文件中引入

"doctrine/doctrine-fixtures-bundle": "^2.3"

引入包

2:更新 composer(具体的指令根据本机composer的引用范围会有差异,参考使用)

php composer update doctrine/doctrine-fixtures-bundle

也可以重新安装 composer

php composer install

上述步骤结束之后执行执行语句有可能会出现以下问题(我本人对于出现这个报错的原理不太清楚,希望有人知道可以指导一下)

There are no commands defined in the "doctrine:fixtures" namespace.

解决方法如下

在项目根目录下找到 app 目录进入修改 Appkernel.php 文件 在其中追加

$bundles[] = new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle();

如果没有执行引入包就追加,代码运行会报错,这点尤其注意在多人合作开发中

QQ截图20160701150053

3:代码写在哪里

在项目在基础Bundle中(就是有Entity目录的)创建下面的目录

QQ截图20160701150350

其中红框标记的类名格式为Load+(你要初始化表的实体类名)+Date.php

4:类中代码的基本格式以及基本写法 (这里要注意的是要改变引用的实体表) 下文中的代码根据此模版演变出来,请联想思考

QQ截图20160701150814

5:具体项目中的运用

(1) 插入多条数据进入表中

对于插入单条语句到表中,上述的实例就可以了,这里我们采取引入JSON文件的形式将数据源导入然后遍历插入

具体实现

⊗将数组存储到JSON文件

/**
 * 写入文件 
 * 
 * 默认存储到项目的web目录中
 *
 * @param $fileName
 * @param $dataArray
 */
public function writeFile($fileName , $dataArray){
    $file = fopen($fileName, 'w');
    $text = json_encode($dataArray);
    fwrite($file, $text);
    fclose($file);
}

生成的文件数据形式:

 ["\u4e0a\u6d77","\u5317\u4eac"]

虽然是个标准的JSON数据,但是很不利于阅读和后期的修改,所以要将中间的字符转化为中文或者可识别的文字,推荐一款工具  在线JSON校验格式化工具,既不影响使用也很好维护

[
 "上海",
 "北京"
]

⊗简单的多条语句插入示例 这里写一个单独的方法:读取数据文件并且将其中的JSON数据转化为数组格式 (方法放在一个公共的地方–方便调用)

/**
 * 获取数据源
 *
 * @param $fileName
 * @return mixed
 */
public static function getFileValue($fileName){
    $filePath =  dirname(dirname(dirname(dirname(dirname(__FILE__))))).'/web/DateSource/'. $fileName;
    $file = fopen($filePath, 'r');
    $data = fread($file, filesize($filePath));
    $data = json_decode($data, true);
    fclose($file);

    return $data;
}

⊗简单的遍历写入
QQ截图20160701154307

⊗对象的概念(外键关联和时间格式对象数据的set写入)

对于外键关联字段或者时间字段 按照上述的写法 应该会出现下面的写法(只是演示)

setUserId(1)   //外键
setTime('2104-4-1 11:52:52')   //dateTime

但是这样写的肯定都撞了一头灰,因为这些字段对于Symfony来说都是对象,而不是一个具体的值,对此感到疑惑的可以参照 Association Mapping 来入门

正确的写法参照下文代码(只是演示)

$repository = $manager->getRepository('User'); //获取User 存储对线   User  实体表名
$articleCategory->setParent($repository->find(1));   //获取需要插入的对象    find() 用id得到对象
$admin->setCreatedAt(new \DateTime());  //设置时间   new \DateTime()  实例化一个时间对象  不加参数默认为当前时间

⊗ 请注意 主键 id  这里 就告诉你 忽视它对你将是一个打击

对Entity有些了解的人都知道用Entity创建数据库表的时候,通常都会默认有一个自增的主键id,而在生成get set方法的时候或许你没有注意没有setId()这个方法,但是当你用本章内容写代码的时候,会突然发现没有这个方法,第一想法就是这怎么办呀!(你有没有傻乎乎的自己写了一个setId()方法,结果显然是失败的)。

因为主键id多数情况下为自增的,所以对于一些有要求的指定id且有规律的数据形式 例如 1,2,3。这些可以通过插入的先后实现,这里唯一要注意的只是需要删除表结构而已,不然等你在写一遍的时候,你会发现结果很搞笑。最后。。。。对于那些主键id需要自定义且规律不好把握的怎么办(例如将编号当id用)这时你突然就发现,目前的东西是无论如何都完成不了。

这里我们先要说以后要注意主键,尽量数据库设计的时候要主键id的用途和数据格式更简单些,使得我们不用这么烦恼。当然目前最重要的如何解决问题。

思路:引入数据库连接对象,执行SQL语句

QQ截图20160701162739

 

最后大家能积极回复,告诉我,您对本文的看法。。。。。。。。。。。。

转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/17065.html


pay_weixin
pay_weixin
微信打赏
pay_weixin
支付宝打赏
感谢您对作者Jay的打赏,我们会更加努力!    如果您想成为作者,请点我