[英]How can i write this query in cakephp-3 way?
原始SQL查询:
SELECT *
FROM
(SELECT p.id,
p.title,
p.mark,
(SELECT max(created)
FROM comments c
WHERE c.post_id=p.id
AND c.mark=1) AS latest_at
FROM posts p) AS Post
WHERE Post.latest_at IS NOT NULL
ORDER BY latest_at DESC LIMIT 10
我有这两个表:
$postsTable = TableRegistry::get('Posts');
$comments = TableRegistry::get('Comments');
我用cakephp-3进行了内部查询:
SELECT p.id,
p.title,
p.mark,
(SELECT max(created)
FROM comments c
WHERE c.post_id=p.id AND c.mark=1) AS latest_at
FROM posts p
Cakephp-3与cakephp-3 querybuilder的内部SQL(下面的查询正确吗?):
$subquery = $comments->find();
$subquery->select([$subquery->func()->max('created')])
->from(['c'=>'comments'])
->where(['c.post_id=p.id','mark=1']);
$pquery = $postsTable->find()
->select(['p.id','p.title','p.mark','latest_at'=>$subquery])
->from(['p'=>'posts']);
我如何以cakephp-3方式编写外部选择查询? (从(派生表)中选择*)
提前致谢。 任何答案将不胜感激。
要直接回答您的问题,这是如何在另一个查询的from部分中使用子查询:
$query = $this->MyTable->connection()->newQuery();
$query->select('*')->from(['Post' => $subqueryObject])->fetchAll('assoc');
这将返回结果数组,如果您知道应将其实体化为哪种类型,请执行以下操作:
$query = $this->Posts
->find()
->select($listOfFields)
->from(['Posts' => $subqueryObject], true)
->toArray();
这是一个非常简单的问题的非常复杂的解决方案(即获取带有最新评论的帖子)。
更好的查询是:
select posts.* from posts join comments on (comments.post_id = posts.id) group by posts.id order by comments.created desc limit 1
执行此查询的ORM方式为:
$post = $postsTable
->find()
->select(['Posts.id', 'Posts.title', 'Posts.mark', 'Comments.created'])
->leftJoinWith('Comments', function ($q) {
return $q->where(['Comments.mark' => true]);
}))
->group(['Posts.id'])
->order(['Comments.created' => 'desc'])
->first();
对于特殊情况,cakephp允许您编写RAW SQL并保持Cakephp方式。 只需在模型中创建一个函数,然后将其放置在$this->query("...")
编写该查询。
示例(在模型中):
public function getPosts(){
$this->query("SELECT * FROM Posts AS Post"); //put complext query here
}
然后在Controller中:
$posts = $this->Post->getPosts();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.