什么是ORM?
ORM(Object-Relational Mapping,面向对象的关系数据库映射)是一种将对象模型和关系数据库模型进行映射的技术,使得开发者可以使用面向对象的方式来操作关系型数据库。
ORM查询
在CakePHP中,ORM查询使用的是Query对象。Query对象封装了与数据库的所有交互细节,开发者只需要调用它的方法就可以完成我们需要的各种查询操作。
创建Query对象
在CakePHP中,创建Query对象的方法有多种,最常用的是使用Table对象的query()方法或connection()方法。
// 使用Table对象的query()方法
$articles = $this->Articles->query();
// 使用connection()方法
$connection = ConnectionManager::get('default');
$articles = $connection->newQuery();
基本查询
下面是一些常用的查询方法:
select(): 选择要查询的表字段
from(): 指定要查询的表名
where(): 指定查询条件,可以使用数组或字符串
andWhere(): 添加AND条件
orWhere(): 添加OR条件
order(): 按指定字段排序
limit(): 限制返回的结果数量
offset(): 指定取回结果开始的位置
以下是一个使用Query对象进行基本查询的例子:
$articles = $this->Articles->query()
->select(['title'])
->from('articles')
->where(['published' => true])
->order(['created' => 'DESC'])
->limit(10)
->execute()
->fetchAll('assoc');
以上代码将会查询数据库中的'articles'表,获取所有'published'字段为true的文章,并以'created'字段降序排序。查询结果将会限制只获取10条。最后以关联数组的形式获取查询到的记录。
高级查询
在CakePHP中,我们可以使用Query对象的一些方法实现更加灵活、复杂的查询。
子查询
使用subquery()方法可以把一个Query对象作为子查询,从而实现更加复杂的联合查询。
$subquery = $this->Articles
->query()
->select(['id'])
->from('articles')
->where(['published' => true]);
$articles = $this->Comments
->query()
->select(['article_id', 'comment_count' => $query->func()->count('*')])
->from('comments')
->where(function ($exp, $query) use ($subquery) {
return $exp->in('article_id', $subquery);
})
->group(['article_id'])
->execute()
->fetchAll('assoc');
以上代码实现了:在'comments'表中,根据'article_id'分组,获取每篇文章的评论总数。为此需要使用一个子查询,从'articles'表中查询出所有已发布过的文章的ID,然后用这些ID过滤出评论中针对这些文章的评论。
联合查询
使用union()方法,可以将多个Query对象合并成一个查询结果。它们的字段名和数据类型必须相同。
$published = $this->Articles
->query()
->select(['id', 'title'])
->from('articles')
->where(['published' => true]);
$scheduled = $this->Articles
->query()
->select(['id', 'title'])
->from('articles')
->where(['published' => false]);
$articles = $published
->union($scheduled)
->execute()
->fetchAll('assoc');
以上代码实现了:从'articles'表中查询出所有已发布和未发布的文章,并合并成一个结果。
自定义函数
使用functionExpression()方法可以调用自定义的数据库函数。它可以用来实现查询中没有内置函数的情况。
$articles = $this->Comments
->query()
->select(['article_id', 'day_of_week' => $query->func()->date_format(['created', '%W'])])
->from('comments')
->execute()
->fetchAll('assoc');
以上代码实现了:从'comments'表中查询出每条评论的创建时间,然后以周几的形式呈现。
总结
通过上述例子,我们可以发现,使用Query对象可以轻松地进行各种查询操作,从基本的查询,到高级的子查询、联合查询、自定义函数等,都可以使用Query对象来实现。掌握Query对象的使用,可以让我们更方便地将面向对象的编程方式应用到关系数据库操作中。这不仅可以提高开发效率,也可以减少错误和调试时间。