【问题标题】:Joining With SQL Function In CakePHP 3在 CakePHP 3 中加入 SQL 函数
【发布时间】:2017-11-09 12:10:54
【问题描述】:

您好,我想将此查询更改为 cakePHP 3.0 格式,但代码无法正常工作,你们能帮我解决这个问题吗?

普通 SQL:

SELECT COUNT(user_tag_review.id) AS user_numbers, SUM(user_rating.rating_value) AS rating_value FROM user_tag_review INNER JOIN user_rating ON user_tag_review.id = user_rating.review_id WHERE user_tag_review.recruiter_id = 2 AND user_rating.rating_id = 1

我用过的CakePHP代码:

$review_table = TableRegistry::get('UserTagReview');
        $query = $review_table->find();
        $query->select(["user_numbers" => $query->func()->count("UserTagReview.id")])
                ->hydrate(false)
                ->join(["table" => "user_rating",
                    "alias" => "r",
                    "type" => "INNER",
                    "condition" => ['r.review_id = UserTagReview.id']
                ])
                ->select(["rating_value" => $query->func()->sum("r.rating_value")])
                ->where(["UserTagReview.recruiter_id" => $recruiter_id, "UserTagReview.rating_id = " . 1]);

        $result = $query->all()->toArray();

【问题讨论】:

  • “不工作”在这里没有帮助。你确定是condition 而不是conditions 吗?
  • 是的条件选项在我加入但不工作任何类型的 sql 函数时工作......
  • 肯定是conditions,复数形式。并且,正如@code-kobold 所提到的,“不起作用”不是正确的问题描述,请始终尽可能具体,并描述确切会发生什么,以及您的期望而是发生。

标签: sql cakephp cakephp-3.0


【解决方案1】:

我认为将 SQL 迁移到 Cake 的更简单方法是 fields finder 中的选项:

$table = TableRegistry::get('UserTagReview');

$result = $table
    ->find('all' , [
        'fields' => [
            'user_numbers' => 'COUNT(UserTagReview.id)', 
            'rating_value' => 'SUM(user_rating.rating_value)'
        ], 
        'join' => [
            [
                'table' => 'user_rating', 
                'alias' => 'user_rating', 
                'type' => 'INNER', 
                'conditions' => [
                    'UserTagReview.id = user_rating.review_id'
                ]
            ]
        ], 
        'conditions' => [
            'UserTagReview.recruiter_id' => 2, 
            'user_rating.rating_id' => 1

        ]
    ])
->hydrate(FALSE)
->toArray();

也许这段代码不是 100% 正确,但关注fields 数组——如果我们使用它作为关联数组,我们可以评估任何 sql:

'fields' => [
    'alias' => 'COUNT(IF(1,1,0))'
]

【讨论】:

  • 也可以将原始 SQL 与 select() 一起使用,但通常最好避免这种情况。还应该注意的是,最好使用查询构建器 API,它更不容易出错,并在 IDE 中提供适当的上下文帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
  • 2017-07-16
  • 2020-05-14
  • 2015-08-06
  • 2021-02-06
  • 1970-01-01
相关资源
最近更新 更多