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 ...
随机推荐
- 5maven工程莫名其妙只在项目名称那里有一个红叉
manven工程里面没有报错的地方,编译也没有问题,只是项目名称那里有一个红叉. 解决办法: 右击项目-->maven-->update project 注意: 这种方法有时可 ...
- Eclipse连接sqlserver体验过程
以前装的sqlserver 2008试用期到了,就按照网上的步骤,彻底删除了sqlserver,然后又重新装了下,再用eclipse连接的时候,发现提示TCP/IP被禁用,然后找到了sqlserver ...
- CCSUOJ评测系统——第一次scrum冲刺
1.第一次冲刺任务安排 对Github上的HUSTOJ开源项目进行Fork,搭建基本环境 2.用户需求 ①基本功能显示在首页 ②能够提交题目并判题,并对自己所提交的题目正确性进行反馈,能够查看自己提交 ...
- ubuntu密码正确,却不能登录图形界面
传统的方法是修改.Xauthority文件权限,不过我试了没有用. 后来发现我的问题是因为安装了NVIDIA cuda驱动而导致的. 所以先卸载nvidia驱动,再更新,就可以正常进入了. 命令: s ...
- ssh终端常用快捷键
ssh终端常用快捷键 快捷键 描述 Ctrl+a 光标移动到行首 Ctrl+e 光标移动到行尾 Ctrl+c 终止当前程序 Ctrl+d 删除光标前的字符,或者推出当前中断 Ctrl+l 清屏 Ctr ...
- Invalid argument during startup: unknown conf file parameter : requirepass
redis 设置来密码,出现来这个错误, 把配置文件那一行的 空格 去掉 # requirepass foobared 改成 requirepass 123456 因为# 和 requirepass ...
- 使用Percona MySQL 5.7版本遇到的坑
监控DB由于使用的TokuDB引擎,因此选择使用Percona MySQL 5.7版本,在使用过程中遇到了比较多的坑,在这里做一下简单的记录,希望对广大DBA有帮助. load文件飙升导致的DB雪崩 ...
- zhuangxiu
红宝石家居广场国际家居馆 党湾综合市场(青年文明路)
- 【2017-11-19】Linux基础知识:TP-Link WN823N无线网卡(RTL8192EU芯片)的X86-64及AARCH64驱动安装
目的: 使类似于树莓派的AARCH-64架构的嵌入式设备能通过USB无线网卡连接上以太网: 该设备有LAN接口,但在前一次系统固件升级后,其内部的三个网络接口可以相互ping通,但任一接口无法ping ...
- ZT 计算一个无符整数中1Bit的个数(1) 2010-04-20 10:52:48
计算一个无符整数中1Bit的个数(1) 2010-04-20 10:52:48 分类: C/C++ [转]计算一个无符整数中1Bit的个数(1) Count the number of bits ...