执行语句:
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 DoctrineBundleFixturesBundleDoctrineFixturesBundle();
如果没有执行引入包就追加,代码运行会报错,这点尤其注意在多人合作开发中
3:代码写在哪里
在项目在基础Bundle中(就是有Entity目录的)创建下面的目录
其中红框标记的类名格式为Load+(你要初始化表的实体类名)+Date.php
4:类中代码的基本格式以及基本写法 (这里要注意的是要改变引用的实体表) 下文中的代码根据此模版演变出来,请联想思考
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);
}
生成的文件数据形式:
["u4e0au6d77","u5317u4eac"]
虽然是个标准的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;
}
⊗简单的遍历写入
⊗对象的概念(外键关联和时间格式对象数据的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)); //获取需要插入的id的对线 find() 用id得到对象
$admin->setCreatedAt(new DateTime()); //设置时间 new DateTime() 实例化一个时间对象 不加参数默认为当前时间
⊗ 请注意 主键 id 这里 就告诉你 忽视它对你将是一个打击
对Entity有些了解的人都知道用Entity创建数据库表的时候,通常都会默认有一个自增的主键id,而在生成get set方法的时候或许你没有注意没有setId()这个方法,但是当你用本章内容写代码的时候,会突然发现没有这个方法,第一想法就是这怎么办呀!(你有没有傻乎乎的自己写了一个setId()方法,结果显然是失败的)。
因为主键id多数情况下为自增的,所以对于id没,所以主键id不设置会自动的增加有要求的数据可以不考虑这个烦恼,而对于一些有要求的需要指定id且有规律的 例如 1,2,3。这些可以通过插入的先后实现,这里唯一要注意的只是需要删除表结构而已,不然等你在写一遍的时候,你会发现结果很搞笑。最后。。。。对于那些主键id需要自定义且规律不好把握的怎么办(例如将编号当id用)这时你突然就发现,目前的东西是无论如何都完成不了。
这里我们先要说以后要注意主键,尽量数据库设计的时候要主键id的用途和数据格式更简单些,使得我们不用这么烦恼。当然目前最重要的如何解决问题。
思路:引入数据库连接对象,执行SQL语句
最后希望大家能积极回复,告诉我,您对本文的看法