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表
其它的一些条件查询可以查看手册