CodeIgniter Doctrine2基本使用(二)(转)
2018-06-22 05:39:16来源:未知 阅读 ()
CodeIgniter Doctrine2基本使用(二)
继上次写的一篇文章《CodeIgniter Doctrine2基本使用(一)》写到操作实体的之通过Channel这个实体向数据库表插入一条数据,那么今天要写的就是通过实体获取数据,当然查询这一块比较多,可能也会分好几篇讲。
Doctrine2 简单的用法
操作实体
- 《CodeIgniter 3.0整合Doctrine2》
- 《CodeIgniter Doctrine2基本使用(一)》
上一篇文章讲到插入一条数据,插入很简单只要设置实体的成员属性的值就能完成,当然如果有多个实体的话可以多次使用 $this->em->persist();
这个方法。然后只要再执行一次 $this->em->flush();
这个方法就行了,它会进行一次数据库连接,然后执行上面实体生成的SQL语句。
简单查询操作
通过Entity查询的方式 有很多,我们先从最简单的开始,还是以Entity\Channel
这个实体为例,以下面一段代码为例:
public function index()
{
$id = 1;
$limit = 20;
$offset = 1;
/**
* @var $channelInfo Entity\Channel
* @var $channelOneBy Entity\Channel
*/
$channelRepository = $this->em->getRepository('Entity\Channel');
$channelAll = $channelRepository->findAll();
$channelInfo = $channelRepository->find( $id );
$channelOneBy = $channelRepository->findOneBy([
'channelName' => '百度'
], [
'channelId' => 'DESC'
]);
$channelBy = $channelRepository->findBy([
'channelName' => '阿里'
], [
'channelId' => 'DESC'
], $limit, $offset);
/** @var $value Entity\Channel */
foreach( $channelBy as $value )
{
echo $value->getChannelName();
}
echo $channelInfo->getChannelName();
var_dumt( $channelInfo );
}
看上面一段代码,分别写了4个咱们比较常用的并且简单的查询方式,下面对这些方法进行一个简单的解释:
findAll
这个方法表示查询这个实体的所有数据,也就是查询相应表的所有数据,它返回的是一个多维数组 对象,可以通过foreach
进行遍历。find
这个是按照ID查询数据,返回一条结果,也就是一个Channel
实体对象。findOneBy
这个是根据条件查询一条数据,可传入两个数组参数,第一个参数是简单的查询数组,可以写多个它们是AND
的关系。第二个参数是排序,上面我是channelId
这个字段排序。findBy
这个与上面那个findOneBy
方法类似,前两个参数都一样,第三个参数表示查询的数量,第四表参数表示从第几行开始,返回的是多维数组对象,可以用foreach
遍历。
为什么我要写 /** @var $value Entity\Channel */
这样的一些注释? 关于这点,我上篇文章已经讲过了一些,可远远不只是那样。这样写表示 $value
这个变量它指向了实体对象 Entity\Channel
,因为查询到结果后把结果设置到Entity\Channel
这个实体上并且返回这个实体。然后咱们就可以使用这个实体里的一些方法了,比如当你输入 $value->
的时候IDE应该提示这个实体上有哪些方法,然后你找到自己需要的照着敲就是了,这种写法对编辑器是比较友好的。如果对返回的东西不熟悉的话使用var_dump()
这个函数把它打印出来看一下就知道了。
当然这里只是最简单的几种用法如果想了解更多的用法可以去看 Doctrine\ORM\EntityRepository
这个类或继续看我下面的讲解。
往往有时间就上面这些查询是无法满我们的需求的,我们还需要更多的更加复杂的查询功能,当然 Doctrine\ORM\EntityRepository
也提供了给开发人员自己定更复杂的语句的方法,比如:
createQueryBuilder
createNamedQuery
createResultSetMappingBuilder
createNativeNamedQuery
想知道更多可以去doctrine的官网查询更多的相关资料(前提是你英文足够好),当然它提供的这些方法我不建议在控制器上使用,这个时候我们最好把它单独出来,减少代码冗余提高复用性。这个时候我们就要使用到 Repository
了,还记得上篇文章我对Repository的一些简单的介绍吗?什么?不知道?回去把我写的文章抄写三遍...
扩展库 Repository
咱们上一篇文章提到过Repository
这个东西,如果有不清楚的可以点这里《CodeIgniter Doctrine2基本使用(一)》 其实写在Repository里就是为了同样的东西可以重复调用,提高代码的复用性。
那天下面我就举几个例子吧,说这么还不如直接看代码。
/**
* 根据渠道tag查询渠道信息
* @param $tag
* @return array
*/
public function findChannelByTag( $tag )
{
return $this->_em->createQueryBuilder()
->select("c")
->from('Entity\Channel', 'c')
->where('c.channelTag = :tag')
->setParameter( 'tag', $tag )
->getQuery()->getSingleResult();
}
/**
* 分页查找所有渠道
* @param $page
* @return mixed
*/
public function findChannelPage( $page )
{
return $this->_em->createQueryBuilder()
->select("c")
->from('Entity\Channel', 'c')
->orderBy('c.channelId', 'desc')
->setMaxResults( 10 )
->setFirstResult( (($page -1 ) * 10 ) )
->getQuery()->getResult();
}
/**
* 统计渠道数量
* @return mixed
*/
public function countChannelAll()
{
return $this->_em->createQueryBuilder()
->select("COUNT(c.channelId)")
->from('Entity\Channel', 'c')
->getQuery()->getSingleScalarResult();
}
如以上写的这些方法,相信大多数人都能看得懂吧,基本每个方法都是这样,更多的方法请查看Doctrine\ORM\QueryBuilder这个类。
- createQueryBuilder() 创建一个查询生成器
- select() 需要查询的字段,要注意的是这里写的字段是
Entity\Channel
里面成员属性所对应的字段,可以自定义查询的字段。比如select('c.channelId,c.channelTag')
它只会返回两个字段数据(理论上是这样)。如果有关联查询如innerJoin
,leftJoin
等关联查询那么可以这样写select('c', 'u')
当然我这样写的比较少,基本都是使用 ManyToOne 、 OneToOne等形式来进行关联查询,这个我后面再讲,当然也可以通过addSelect()这个方法来设置多个查询实体
$this->_em->createQueryBuilder()
->select('u')
->addSelect('c')
->from('Entity\User', 'u')
->leftJoin('Entity\Channel', 'c');
- from() 这个无需多讲就是查询哪个实体,写它的全名空间就好了,这里传两个参数,第二个是别名
- where() 这个也不用多解释了,传的查询条件。可以写多个比如
where('c.channelTag = :tag AND c.channelId = :id')
当然,如果不想这样写的话还可以通过andWhere()
方法来设置条件。 - orWhere() 与上面一样,用过*CodeIgniter*框架的应该都知道吧,用法都差不多,得配合where()方法使用
$this_em->createQueryBuilder()
->select('c')
->from('Entity\Channel', 'c')
->where('c.channelId = :id')
->orWhere('c.channelTag = :tag')
- delete() 这个也很好理解,当然就是删除啦如下列子
$this->_em->createQueryBuilder()
->delete('Entity\Channel', 'c')
->where('c.channelId = :id')
->setParameter('id', 1);
- update() 这个就是更新数据的方法,需要配合下面的set()方法进行使用
$this->_em->createQueryBuilder()
->update('Entity\Channel', 'c')
->set('c.channelName', "{$channelName}")
->where('c.channelId = 1');
- set() 这个也不用多讲解了,配合上面的update()方法使用上面有例子
- join()、innerJoin()、leftJoin() 关联查询这几个方法的使用方式类型我下面就写一个例子好了,对了这里需要把Join这个类给加载进来,
use Doctrine\ORM\Query\Expr\Join
因为到现在为止我项目用得比较少,非常少基本都是用ManyToOne()做的联查关于这个联查我将在下一篇文章进行讲解
$this_em->createQueryBuilder()
->select('u')
->from('Entity\User', 'u')
->innerJoin('Entity\Channel', 'c', Join::WITH, 'c.channelId = u.channelId');
- setParameter() 这个也很好理解,就是设置前面的where条件的参数,上面的where方法我不是定义了
:id
与:tag
这两个flag,这个方法就是对它们进行传参的,这个上面也有例子,我就不再这里凑字数了 - setParameters() 这个方法跟上同那个传参数的方法似,也比较常用,传多个参数
setParameters(new ArrayCollection(array(
new Parameter('id', 1),
new Parameter('tag', 2)
)));
- groupBy()、addGroupBy() 这两个也不用多说吧,就是goup by 怎么整的好像在讲mysql的用法似得
$this->_em->createQueryBuilder()
->select('u')
->from('Entity\User', 'u')
->groupBy('u.channelId');
- having()、andHaving()、orHaving() having的用法跟一样吧,这个用得比较少,因为性能比较低,不太喜欢在mysql上进行过多的运算
- orderBy()、addOrderBy() 这两个也不用多说了,就是排序嘛,不需要写例子吧...上面有
- getQuery() 这个时候还没有生成结果集,只是做了一个查询?
- getResult() 返回多个结果集,最终返回的是一个多维数组对象,可以通过
foreach
进行遍历,遍历出来的value就是它的实体 - getSingleScalarResult() 这个就是返回一个值吧,我只有统计的时候用过它
- getSingleResult() 返回单个结果集,也就是一个实体对象
- getDql() 返回生成的DQL语句?
上面写了辣么多,我怎么感觉自己好像是在讲怎么操作数据库呢?总结就是需要复用的稍微复杂一点的查询就放在Repository里吧,方便你我他。
好了Repository就暂时先讲到这里吧,下一节我们讲 ManyToOne、OneToMany、OneToOne、ManyToMany的查询。
原文目录:https://lattecake.com/post/20045
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:常用PHP方法
- 详解php curl的基本操作方法 2019-10-08
- PHP中配置IIS7实现基本身份验证的方法 2019-09-23
- php实现递归的三种基本方式 2019-09-17
- PHP正则表达式,看这一篇就够啦! 2019-05-22
- PHP全栈学习笔记8 2019-04-25
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash