CodeIgniter Doctrine2基本使用(一)

之前写了一篇文章叫作《CodeIgniter 3.0整合Doctrine2》里面介绍了一些简单的Doctrine2的用法,当然我也已经把它运用到项目上去了。下面我就写一些Doctrine2在CodeIgniter框架上的一些使用及感受吧...

在项目上运用了一段时间后发现,好像代码比格变高了呃,连同事都说你这种写法好像很高级的样纸呃,并且代码特别好看。(嘿嘿,心里偷着乐)虽然现在运用的广度还不是很大,但逐渐的我会把它给运动到所有模块上去,现新功能或新模块都使用了Doctrine ORM结构。新的结构确实可以少写很多代码,虽然运行的效率并不怎么高,不过总会有办法解决的。下面我将对一些我用过或现在正在用的一些东西进行一些简单的讲街,本人文采烂,能力有限看不明白也请谅解谅解...

Doctrine2 简单的用法

创建一个实体 Entity

比如我们现在需要一个渠道channel的数据表,表里面有很多字段那我在 model/Entity 目录创建一个 Channel.php 的文件

// Channel.php 部分代码
namespace Entity;
use Entity\Repository\ChannelRepository;
/**
* Channel
*
* @Table(name="channel", options={"collate"="utf8_general_ci","charset"="utf8"}, uniqueConstraints={@UniqueConstraint(name="channel_code", columns={"channel_code"})})
* @Entity(repositoryClass="Entity\Repository\ChannelRepository")
*/
class Channel { /**
* @var integer
*
* @Column(name="channel_id", type="integer", nullable=false, options={"comment": "渠道id"})
* @Id
* @GeneratedValue(strategy="NONE")
*/
private $channelId; /**
* @var integer
*
* @Column(name="channel_tag", type="integer", nullable=false, options={"comment": "渠道标识"})
* @Id
* @GeneratedValue(strategy="NONE")
*/
private $channelTag; /**
* @var string
*
* @Column(name="channel_name", type="string", length=128, nullable=false, options={"comment": "渠道名称"})
*/
private $channelName; /**
* @var string
*
* @Column(name="channel_time", type="datetime", nullable=false, options={"comment": "渠道创建时间"})
*/
private $channelTime; public function __construct()
{
$this->channelTime = new \DateTime('now');
} }

OK 先写三个字段吧,然后我们进入 ./app目录执行 php doctrine 命令会显示一些doctrine可以使用的一些命令,然后我们现在要创建每个字段的 getter 和 setter 方法,所以我们执行命令

php doctrine orm:generate:entities ./models/ --update-entities="true" --generate-methods="true"

当然可以执行 php doctrine orm:generate:entities --help 查看 orm:generate:entities 的用法; --update-entities="true" 表示需要更新实体 --generate-methods="true" 表示更新或生成每个成员属性的 getter 和 setter 方法(我猜的,因为之前不生成方法时我找了好长时间才知道是怎么回事),对了这里还写了一个构造函数,缺省设置了一个时间,当 new Channnel()的时候就不再需要set这个时间字断了

生成功能后Channel这个实体应该会多出7个方法:

	/**
* Get channelId
*
* @return integer
*/
public function getChannelId()
{
return $this->channelId;
} /**
* Set channelTag
*
* @param integer $channelTag
*
* @return Channel
*/
public function setChannelTag($channelTag)
{
$this->channelTag = $channelTag; return $this;
} /**
* Get channelTag
*
* @return integer
*/
public function getChannelTag()
{
return $this->channelTag;
} /**
* Set channelName
*
* @param string $channelName
*
* @return Channel
*/
public function setChannelName($channelName)
{
$this->channelName = $channelName; return $this;
} /**
* Get channelName
*
* @return string
*/
public function getChannelName()
{
return $this->channelName;
} /**
* Set channelTime
*
* @param \DateTime $channelTime
*
* @return Detail
*/
public function setCreateTime($channelTime)
{
$this->channelTime = $channelTime; return $this;
} /**
* Get channelTime
*
* @return \DateTime
*/
public function getChannelTime()
{
return $this->channelTime;
}

getter 是获取这个字段的值,setter 是设置该字段的值,咱们回到上面的成员属性看比如:

	/**
* @var string
*
* @Column(name="channel_name", type="string", length=128, nullable=false, options={"comment": "渠道名称"})
*/
private $channelName;

注释里有 @var string 这个表示它返回的会是什么,这不重要,重要的看下面这个 @Column 这个很重要,是必须设置的;括号里边就是对这个成员属性的相关设置也就是这个字段的属性。

  • name: 表字段名(string)
  • type: 表字段类型(string,integer,datetime,text,bigint等等)
  • length: 表字段长度(整型)
  • nullable: 是否为空(true or false)
  • unique: 是否唯一(true or false)
  • precision: (暂时不知道是干啥的只设置过0)
  • scale: (与上个字段一样为0吧)
  • options: 这里可以设置很多东西,我好像只设置过 commint 跟 default 这两个参数

OK明白上面的东西后我们就生成SQL语句吧执行命令 php doctrine orm:schema-tool:create --dump-sql 生成建表语句,如果想直接创建表的话把后面的参数 --dump-sql去掉就行了; php doctrine orm:schema-tool:update --dump-sql 这条命令与上面生成SQL语句的命令一样这是打印出有更新的字段如果不想打印把后面的参数 --dump-sql去掉就直接更新数据库表了;

这样我们表就建好了;

Repository

在最上面的Channel类的注释里有没有发现 @Entity(repositoryClass="Entity\Repository\ChannelRepository")这么一段参数; 这个就是可以自己扩展的库,也就相当于自己在CI框架里写的MODEL类,如果我们要使用它的话需要执行一条创建对它进行创建:

php doctrine orm:generate:repositories ./model

执行上面命令后会把./model下面的所有实体如果设置了@Entity的实例全部创建一个 Repository 类库;

// ./app/model/Entity/Repository/ChannelRepository.php
namespace Entity\Repository; use Doctrine\ORM\EntityRepository;
//use Doctrine\ORM\Query\Expr\Join; /**
* ChannelRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class ChannelRepository extends EntityRepository
{
}

然后我们再回到 Channel 实体把刚刚创建的 ChannelRepository 库给引用进来并继承它;

use Entity\Repository\ChannelRepository;
class Channel extends ChannelRepository{}

这样的话,当我们加载一个实体后就可以实现这个实体里自己写的扩展方法了,非常 方便呢,后面我会讲;

OK创建实体基本的方法大概就是上在这些,如有不清楚的地方请大家在下面评论区留言。。。

加载实体

既然我们实体及实体库已经创建好了,那要如何使用它呢?

首先先把需要用的这个实体给加载进来,我们可以使用: $this->em->getRepository 方法,当然前提是你必须先加载Doctrine这个类库文章《CodeIgniter 3.0整合Doctrine2》好像有讲,可以去看看,不想看的话我下面再写一下

后面写的 $this->em 的由来
平时我们在CI创建一个控制器时需要继承一个父控制器一般在 ./app/core/MY_Controller.php 不要问我为什么要这样写,不明白的回去把CodeIgniter框架抄写三遍
然后我们在 MY_Controller 控制器的 __function() 方法载入 Doctrine 扩展类可以参考下面代码

// ./app/core/MY_Controller.php
class MY_Controller extends Controller { protected $em; function __construct()
{
parent::__construct();
$this->load->library('doctrine');
/** @var $em Doctrine\ORM\EntityManager */
$em = $this->doctrine->em;
$this->em = $em;
}
}

然后我们就可以使用 $em 这个成员了;

要如何使用呢?

比如我们创建一个控制器就叫 channel.php 好了

class Channel extends MY_Controller{
function __construct()
{
parent::__construct();
} public function index()
{
/** @var $channelRepository Entity\Channel */
$channelRepository = $this->em->getRepository('Entity\Channel'); $channelRepository->findAll(); }
}

为什么要加 /** @var $channelRepository Entity\Channel */这样一个注释呢?

大家可别小看这种注释,很有用的,不信的话你按住command+鼠标左键点一下试试(在大多IDE上都是支持的,Sublime Text也可以使用)

好了,加载实体基本上就算是讲完了。

操作实体

上面我们已经把实体给加载进来了,现在我们要对数据库过行相关操作;其实呢我们操作实体就相当于是在操作数据库表,每一个实体就相当于是一张表,它于表是一种映射关系。

插入一条数据

持入一条数据首先需要把这个实体实例化,也就是new 一下这个实体我们才能使用它,比如以下代码:

/** @var  $channel Entity\Channel */
$channel = new \Entity\Channel(); $channel->setChannelTag()
->setChannelName(); $this->em->persist( $channel );
$this->em->flush();

OK我来简单的讲解一下上面的代码,这里我们需要吧。我们知道这张表一共有四个字段分别是

  • channelId
  • channelTag
  • channelName
  • channelTime

然后我们需要分别对这些字段设置一些值,那我们就需要用到 Entity\Channel 这个实体里刚刚生成的 setter 方法了。 那为什么我只set了两直字段呢?

  1. channel_id 是一个主键我们不需要对它进行操作,可以看到主建是没有setter方法的所以不需要设置这个字段的值,执行前它是空的如果成功拷入数据后这个字段就会是刚刚插入后返回的ID
  2. channel_time 上面已经讲到了 我们在 Entity\Channel 这个实体的构造函数里已经对它进行赋值了,所以它是有内容的,不信的话你 var_dump($channel) 这个实体看它的成员的值

设置完后我们需要调用 $this->em->persist($channel) 这人方法把设置好的 Entity\Channel 这个实体塞进去,注意:此时并没有执行SQL语句进入数据。我们需要调用一下 $this->em->flush() 这个方法执行SQL语句,如果想看它生成的是什么样的SQL的话可以进入数据库输入以下命令:

  • show variables like '%gene%';
Variable_name Value
general_log OFF
general_log_file /opt/rh/mysql55/root/var/lib/mysql/default.log

我们可以看到现在所有的数据库操作日志状态是OFF 我们需要所它设置成 ON,执行以下命令

  • set global general_log = ON;

/opt/rh/mysql55/root/var/lib/mysql/default.log这个就是操作日志,我们可以 tail -f一下它然后可以可看到以后我们地数据库的所有操作了。

查询操作

原文链接:https://lattecake.com/post/20044

CodeIgniter Doctrine2基本使用(一)(转)的更多相关文章

  1. CodeIgniter Doctrine2基本使用(二)(转)

    CodeIgniter Doctrine2基本使用(二) 继上次写的一篇文章<CodeIgniter Doctrine2基本使用(一)>写到操作实体的之通过Channel这个实体向数据库表 ...

  2. [CodeIgniter] 在自定义类库中使用config配置项

    通常情况下,Controller 中的方法可以通过 $this->config->item('item_name') 的方式来加载配置文件中的值 但是如果不继承 CI_Controller ...

  3. 学习CodeIgniter框架之旅(一)自定义模板目录

    在常用的框架本身都已经做好了分层和目录结构,但这在很多时候不满足项目的需求甚至在某些情况下变得不合理,因此很多时候需要自定义目录结构,在此就看看如果在CodeIgniter框架中自定义模板目录: 在C ...

  4. CodeIgniter 3 源码学习笔记《一》

    CodeIgniter 是一套给 PHP 网站开发者使用的应用程序开发框架和工具包. 它的目标是让你能够更快速的开发,它提供了日常任务中所需的大量类库, 以及简单的接口和逻辑结构.通过减少代码量,Co ...

  5. *** $CI =& get_instance() 用法:关于CodeIgniter中get_instance() 函数

    使用场景: 注意 get_instance 的使用场景,这个方法并不是用在控制器中的.而是用在控制器外面,比如类库中,想操作 CI 超级对象的时候,超级对象实际上就是当前控制器的实例. 你随便下个CI ...

  6. ***CodeIgniter集成微信支付(转)

    微信支付Native扫码支付模式二之CodeIgniter集成篇  http://www.cnblogs.com/24la/p/wxpay-native-qrcode-codeigniter.html ...

  7. Codeigniter的Redis使用

    1. ./config/redis.php: <?php $config['redis_host'] = '127.0.0.1'; $config['redis_port'] = '6379'; ...

  8. 基于Codeigniter框架实现的APNS批量推送—叮咚,查水表

    最近兼职公司已经众筹成功的无线门铃的消息推送出现了问题,导致有些用户接收不到推送的消息,真是吓死宝宝了,毕竟自己一手包办的后台服务,影响公司信誉是多么的尴尬,容我简单介绍一下我们的需求:公司开发的是一 ...

  9. nginx下搭建CodeIgniter问题集锦

    nginx环境下CodeIgniter会出现一些问题! 1.数据库驱动连接失败! 出现如下问题: A PHP Error was encountered Severity: Warning Messa ...

随机推荐

  1. Gson基本操作,JsonObject,JsonArray,String,JavaBean,List互转

    (转自)https://www.cnblogs.com/robbinluobo/p/7217387.html String.JsonObject.JavaBean 互相转换 User user = n ...

  2. request对象方法

    1.html <html> <head> <meta http-equiv="Content-Type" content="text/htm ...

  3. 第八章 SQL高级处理 8-2 GROUPING运算符

    一.同时得到合计行 合计行是不指定聚合键时得到的汇总结果. UNION ALL与UNION的不同之处是它不会对结果进行排序,因此比UNION性能更好.   二.ROLLUP——同时得出合计和小计 GR ...

  4. 新建一个去除storyboard的项目

    新建一个去除storyboard的项目 1. 新建项目并删除 *.storyboard 以及与之相关的杂项 2. 设置 UIWindow 的 rootViewController 复制粘贴代码如下 s ...

  5. opengl redbook Fatal Error in XXXXXX pixel format with necessary capabilities not found

    随便运行书中的一个程序aaindex.c时出现了下面的错误:pixel format with necessary capabilities not found 解决方法: http://www.ed ...

  6. September 30th 2017 Week 39th Saturday

    The simplest answer is often the correct one. 最简单的答案通常是最正确的答案. Simplest is always best. Sometimes yo ...

  7. 'Table is Marked as crashed and should be repaired Error'.Mysql表损坏解决方案

    问题表现:由于服务器崩溃导致表损坏无法打开或者能打开但是无法写入数据(提示主键重复但实际没有该主键且该主键值在最大值范围内). 本文提供两种检查修复方式:mysqlcheck 和 myisamchk ...

  8. SQL Server错误处理

    一.SQLServer数据库引擎错误 1.查询系统错误信息 SQLServer在每个数据库的系统视图sys.messages中存储系统自定义(Message_id <= 50000)和用户自定义 ...

  9. iPhone/android的viewport 禁止页面自动缩放

    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scal ...

  10. HTML5新增和废弃的标签

    一.废弃的标签 以下的 HTML 4.01 元素在HTML5中已经被删除,虽然浏览器为了兼容性考虑都还支持这些标签,但建议使用新的替代标签,矛盾的是老浏览器对新标签的支持度又不够,视项目的受众对象而定 ...