cakephp v3.4 数据库相关操作

cakephp v3.4 数据库相关操作

查询对象 Query Object
class Cake\ORM\Query

获取Query object
表对象 Table Object 使用find()返回

1.任何情况下都可以从TableRegistry中获取
use Cake\ORM\TableRegistry;
$articles = TableRegistry::get(‘Articles‘);
$query = $articles->find();

2.在对应的控制器中(框架自动就创建了)
$query = $this->Articles->find();

返回表中的行
query object是一个可进行迭代操作的对象
迭代的过程中 会实际的去查询数据库, 不迭代时
是不会执行查询操作的 就是惰性执行
foreach ($query as $article) {
debug($article->title);
}

下面是一些常见的操作

$query = $articles
->find()
->select([‘id‘, ‘name‘])
->where([‘id !=‘ => 1])
->order([‘created‘ => ‘DESC‘]);

这就是所谓的链式调用 最后返回的仍然是
Query object 对象 并没有实际去查询数据库

debug($query) 可以显示该对象内部状态

$article = $articles
->find()
->where([‘id‘ => 1])
->first();//查询并返回第一行(实际执行了数据库查询)

$article = $articles
->find()
->extract(‘title); //查询并返回title列

查询键值对
$list = $articles->find(‘list‘) //查询键值对
->toArray();//实际执行数据查询操作
会返回两个字段 id 另一个是模型中设置的默认的

$list = $articles->find(‘list‘, [‘valueKey‘ => ‘id‘, ‘valueField‘ => ‘other‘]);

指定返回的键值对字段

queries are Collection(收集 集合) objects
所有的查询对象都是收集对象 可以使用所有的collection method

$keyValueList = $articles->find()
->combine(‘id‘, ‘title‘);
//combine方法返回id title字段
//相当于find(‘list‘)

更高级的查询
map()方法的应用
$result = $articles->find()
->where([‘id‘ => 1])
->order([‘title‘ => ‘DESC‘])
->map( function ($row) {
$row->trimmedTitle = trim($row->title);
return $row;
})
->combine(‘id‘, ‘trimmedTitle‘)
->toArray();

map(function($row) {}) collection method
提供了处理数据的能力 比如一些格式化操作
参数是一个匿名函数 匿名函数默认传入每一个$row对象
即表中的每一行 是一个对象
匿名函数中 我们可以对行的字段数据进行处理
可以覆盖 增加字段到返回的结果中
可以选择返回$row对象 也可以是数组, 字符串

举例:
map(function ($row) {
  return $row->id; //只返回id 此时返回的只是字符串

  return [$row->id, $row->title];//返回数组

  return $row; 对$row对象进行处理后 直接返回
});

toArray()
返回数组 而不是对象  只是最外层为数组  而行很可能还是

一个对象

会实际进行数据库查询的方法
foreach 迭代query object时会实际执行数据库查询

execute() 执行查询操作

all()

toArray()

字段别名
->select([‘pk‘ => ‘id‘, ‘as_title‘ => ‘title‘])

$query
->select([‘slug‘ => $query->func()->concat([‘title‘ => ‘identifier‘, ‘-‘, ‘id‘ => ‘identifier‘])])

相当于
concat(title, ‘-‘, id)

->select($this->articles)//查询所有字段

使用函数
$query = $articles->find();

$year = $query->func()->year([
  ‘created‘ => ‘identifier‘
]);

$time = $query->func()->date_format([
  ‘created‘ => ‘identifier‘,  //识别为字段  identifier作用
  "‘%H:%i‘" => ‘literal‘     //原始字符串  literal
]);

$query->select([
  ‘yearCreated‘ => $year
  ‘timeCreated‘ => $time
]);

相当于
SELECT YEAR(created) as yearCreated, DATE_FORMAT(created, ‘%H:%i‘) as timeCreated
FROM articles;

返回数组而不是实例对象
$query = $articles->find();
$query->hydrate(false); //返回数组 而不是对象
$result = $query->toList();

[
[‘id‘ => 1, ‘title‘ => ‘abc‘]
[‘id‘ => 2, ‘title‘ => ‘abc‘]
]

formatResult()方法的使用
格式化结果
$query->formatResult(function(\Cake\Collection\CollectionInterface $result) {
  return $results->map(function ($row)) {
    $row[‘age‘] = $row[‘birth_data‘]->diff(new \DateTime)->y;
    return $row;
  }
});

$result是一个query object

以上方法也可以用在contain 关联查询
$query->contain([
  ‘Authors‘ => function($q) {//关联表authors
    return $q->formatResult(function \Cake\Collection\CollectionInterface $authors) {//默认传入authors   query object对象
      return $authors->map(function ($author) {
        $author[‘age‘] = $author[‘birth_date‘]->diff(new \DateTime)->y;
        return $author;
      })
    }
  }
]);

$result = $query->all();
以上方式实现了在关联查时对关联的表进行更多的控制, 处理
应该注意的是只操作了关联的authors表

其它的一些条件查询可以查看手册

时间: 2024-10-24 02:43:51

cakephp v3.4 数据库相关操作的相关文章

MFC 对MYSQL数据库相关操作

记得看过有人说,现在的软件基本上都是连着数据库的,如果一个软件没有跟数据库相连,基本没什么作用.虽然这种说法略显片面,但数据库之于软件的重要也是毋庸置疑的. MFC连接数据库应该不算是什么新鲜的命题了,方法是有好几种的,本人试了下,感觉利用MySQL提供的C语言API来进行操作蛮方便的,所以在此记录下相关的操作. 要用MySQL提供的C语言API,首先要包含API的头文件目录,也就是在MFC工程属性中的"包含目录"下添加MySQL安装目录的"include"文件夹.

WinPhone开发数据库相关操作总结

1.首先来说下wp对.sqlite数据库的操作支持,从google,百度,codeplex..等等网站找寻到以下方式: (1)最古老的要数引用第三方Community.CsharpSqlite.WP.dll程序集来使用的(注意:如果你要操作现有存在的.sqlite数据库,而不是自己从头开始创建数据表,添加数据...等,那么你需要在codeplex网站上找到这个源码,进行相应的修改,这样才能够支持使用,不然会碰到很郁闷的"无法打开数据库连接.."之类的错误) (2)第二种跟第一种有所类似

python中MySQL数据库相关操作

一 安装基本环境: 1 安装MySQL数据库, 本文使用的是mariadb数据库,与MySQL相似 1 挂载镜像文件(本次使用的是本地镜像文件) 2 启动MySQL数据库 3 创建用户名和密码并刷新 grant all(表示所有操作) on .(库.表(所有的,也可以指定)) to [email protected](设置用户名为root,链接为本地链接) identified by 'roiot123';(设置密码)flush privileges;(刷新权限) 4 修改默认字符集: serv

MFC List Control控件添加单元格编辑和单元格下拉列表项以适用于数据库相关操作

作为现代的软件,往往是连着数据库的,而连着和用户方便地操作之间,还有着界面这道坎.MFC是Windows上比较好开发用户界面的框架,然而其自带的控件中没有对于数据库表格支持较好的控件,而使用网上提到的 DataGrid 等控件在本人的win8.1+VS2013平台上老出现找不到控件或者头文件的问题,搞的烦死人.最后想到 List Control 控件只要稍作修改,加上单元格编辑和单元格下拉列表,其实就能和数据库进行良好的对接,一百度,果然有人已经做了这件事,实在是太让人感动了!       

YII 数据库相关操作

CDbConnection:  一个抽象数据库连接 CDbCommand:     SQL statement CDbDataReader:  匹配结果集的一行记录 CDbTransaction:数据库事务 访问数据库前需要建立数据库连接:使用DAO建立一个抽象数据库链接: $connection = new CDbConnection($dsn, $username, $password); $connection->active = true;     // 只有激活了连接才可以使用 $co

YII 数据库相关操作(转)

CDbConnection: 一个抽象数据库连接CDbCommand: SQL statementCDbDataReader: 匹配结果集的一行记录CDbTransaction:数据库事务 访问数据库前需要建立数据库连接:使用DAO建立一个抽象数据库链接: $connection = new CDbConnection($dsn, $username, $password);   $connection->active = true;     // 只有激活了连接才可以使用   $connect

C#数据库相关操作:[1]C#连接SQL数据库(转)

对于学生或程序员而言,一般的编程过程中,基本上都会用到数据库,来保存用户登录信息或其他相关数据,本经验不在于教你什么新的知识,只是将一些零碎的数据库知识统一成册,方便人们查阅. Visual Studio是一个很强大的工具,特别是在C#语言运用越来越广的现在. 工具/原料 Visual Studio 2010 SQL Server 2008 1. 创建测试数据库Test 1 1.1 打开SQL Server管理工具 2 1.2 连接数据库服务器 3 1.3 在左侧视图中右键点击“数据库”,选择“

tp5 数据库相关操作笔记

这里如何连接多个数据库? 1,在conif.php文件中添加一个数据库配置(把database.php文件内容复制一份过来),这里取名为db2 2,在控制器的方法中使用 mysql中的参数绑定 mysql中占位符绑定 增删改查? 1 , 原生增删改查在TP中 直接使用Db::execute('原生语言') 2, 通过查询构造器实现增删改查 2.1 增 注意:如果想利用配置里面的表前缀 2.2 删 2.3 改 2.4 查 建议的查询方式? 特色查询? 1,如果如果某字段存的是时间戳,可以直接按照时

Python:MySQL数据库相关操作

系统环境 Ubuntu 16.04.2 LTS mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64) using  EditLine wrapper Python 3.5.2 pip 9.0.1 from /usr/local/lib/python3.5/dist-packages (python 3.5) 查看Python相关模块版本 pip3 pip3 freeze 问题1:安装mysql-connector-python时出现"Unable