CodeIgniter Doctrine2基本使用(一)(转)
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了两直字段呢?
- channel_id 是一个主键我们不需要对它进行操作,可以看到主建是没有setter方法的所以不需要设置这个字段的值,执行前它是空的如果成功拷入数据后这个字段就会是刚刚插入后返回的ID
- 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基本使用(一)(转)的更多相关文章
- CodeIgniter Doctrine2基本使用(二)(转)
CodeIgniter Doctrine2基本使用(二) 继上次写的一篇文章<CodeIgniter Doctrine2基本使用(一)>写到操作实体的之通过Channel这个实体向数据库表 ...
- [CodeIgniter] 在自定义类库中使用config配置项
通常情况下,Controller 中的方法可以通过 $this->config->item('item_name') 的方式来加载配置文件中的值 但是如果不继承 CI_Controller ...
- 学习CodeIgniter框架之旅(一)自定义模板目录
在常用的框架本身都已经做好了分层和目录结构,但这在很多时候不满足项目的需求甚至在某些情况下变得不合理,因此很多时候需要自定义目录结构,在此就看看如果在CodeIgniter框架中自定义模板目录: 在C ...
- CodeIgniter 3 源码学习笔记《一》
CodeIgniter 是一套给 PHP 网站开发者使用的应用程序开发框架和工具包. 它的目标是让你能够更快速的开发,它提供了日常任务中所需的大量类库, 以及简单的接口和逻辑结构.通过减少代码量,Co ...
- *** $CI =& get_instance() 用法:关于CodeIgniter中get_instance() 函数
使用场景: 注意 get_instance 的使用场景,这个方法并不是用在控制器中的.而是用在控制器外面,比如类库中,想操作 CI 超级对象的时候,超级对象实际上就是当前控制器的实例. 你随便下个CI ...
- ***CodeIgniter集成微信支付(转)
微信支付Native扫码支付模式二之CodeIgniter集成篇 http://www.cnblogs.com/24la/p/wxpay-native-qrcode-codeigniter.html ...
- Codeigniter的Redis使用
1. ./config/redis.php: <?php $config['redis_host'] = '127.0.0.1'; $config['redis_port'] = '6379'; ...
- 基于Codeigniter框架实现的APNS批量推送—叮咚,查水表
最近兼职公司已经众筹成功的无线门铃的消息推送出现了问题,导致有些用户接收不到推送的消息,真是吓死宝宝了,毕竟自己一手包办的后台服务,影响公司信誉是多么的尴尬,容我简单介绍一下我们的需求:公司开发的是一 ...
- nginx下搭建CodeIgniter问题集锦
nginx环境下CodeIgniter会出现一些问题! 1.数据库驱动连接失败! 出现如下问题: A PHP Error was encountered Severity: Warning Messa ...
随机推荐
- c# 从一个服务器 访问另外一个服务器上的文件
页面调用 function fnOpen(path) { window.open("~/FileHelp.ashx? url="); //window.open(url); } 后 ...
- linux 文件搜索命令locate及updatedb
windows 搜索工具Everything是根据NTFS日志来搜索的,所以速度特别快 locate 类似于windows的Everything,搜索速度比较快 如果没有locate命令,可安装 yu ...
- idea 自定义视图
效果: 设置:!file:.iml&&!file:.idea//&&!file:.settings//*&&!file:.classpath&& ...
- 深入理解net core中的依赖注入、Singleton、Scoped、Transient(一)
相关文章: 深入理解net core中的依赖注入.Singleton.Scoped.Transient(一) 深入理解net core中的依赖注入.Singleton.Scoped.Transient ...
- 在线制作GIF图片项目愿景与范围
在线制作GIF图片项目愿景与范围 a. 业务需求 a.1 背景 在当今社会中,随着聊天软件和web网站的普及,原创动画制作越来越吸引人们的眼球,一个好的动态图片,可能就会为你的网站或本人赢得更多人的认 ...
- MySQL慢日志简介及Anemometer工具介绍
作者:王航威 - fordba.com 来源:http://fordba.com/box-anemometer-visual-mysql-slow.html,叶师傅对原文内容略有调整 备注:王航威是知 ...
- 解决点击cell执行动画导致的重用问题
解决点击cell执行动画导致的重用问题 说明: 动画的细节都是裸露的,并没有封装,靠看官来优化了. 效果: 源码: https://github.com/YouXianMing/UITableView ...
- ES(ElasticSearch)学习总结
基本概念 一个分布式多用户能力的全文搜索引擎,基于RESTful web接口. Elasticsearch和MongoDB/Redis/Memcache一样,是非关系型数据库.是一个接近实时的搜索平台 ...
- web虎所用2个64位驱动:到底在build时要生成几个版本?
更准确的问法是: 是否需要根据wdk+目标os不同,根据组合生成不同的多组驱动: 1.wdk10:生成windows10和windows2016+的驱动 2. wdk8和wdk8.1:生成window ...
- [转载并收藏]JavaScript 疲劳终极指南:我们行业的真相
这篇文章说的深得我心,特别是前半段. 特此收藏. 中文译文:http://www.zcfy.cc/article/the-ultimate-guide-to-javascript-fatigue-re ...