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表

 

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



转载于:https://www.cnblogs.com/womeng/p/6747814.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值