【问题标题】:CakePHP 3.x Query many Table objects with PaginationCakePHP 3.x 使用分页查询许多表对象
【发布时间】:2018-03-25 02:37:51
【问题描述】:

背景:
我正在使用 CakePHP 3.x,并且正在尝试使用分页构建 ORM 查询。我有表格用户、主题和区域。用户可以有许多主题,但只有一个领域。这是 db 模型:

CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
);
CREATE TABLE topics (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
name VARCHAR(255),
description TEXT,
FOREIGN KEY user_key (user_id) REFERENCES users(id)
);
CREATE TABLE areas (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
UNIQUE KEY (title)
);
CREATE TABLE users_areas (
user_id INT NOT NULL,
area_id INT NOT NULL,
PRIMARY KEY (user_id, area_id),
FOREIGN KEY area_key(area_id) REFERENCES areas(id),
FOREIGN KEY user_key(user_id) REFERENCES users(id)
);

我需要什么
我需要获取按给定区域过滤的所有主题。
我正在尝试下一个:

//1. get the area from the url (OK)
$area = $this->request->getQuery('area');

//2. Get the area from db to get the id
$myarea = $this->Areas->find()->where(['title' => $area])->first();

//3. Get all the users related to the area given
$users = $this->Users->find()->matching('Areas', function ($q){
            return $q->where(['Areas.id' => $myarea->id]);
          });

//4. Get the Topics and Paginate
$topics = $this->paginate($this->Topics->find('all')->innerJoinWith('Users', function ($q){
          return $q->where(['User.id' => $myarea->id]);
        }));

//5. Set the topics (OK)
$this->set(compact('topics'));
$this->set('_serialize', ['topics']);

我有很多错误,我不确定如何正确构建查询。

【问题讨论】:

  • 您遇到了哪些错误,您可以至少发布其中一个吗?

标签: cakephp pagination cakephp-3.x


【解决方案1】:

乍一看,至少有一个错误:

$myarea 在匿名函数中是不可见的。

如果你想在 lambda 函数中使用$myarea,你应该从父作用域继承这个变量:use($var)

http://php.net/manual/en/functions.anonymous.php 示例#3

$users = $this->Users->find()->matching('Areas', function ($q) use ($myarea) {
     return $q->where(['Areas.id' => $myarea->id]);
});


$topics = $this->paginate($this->Topics->find('all')->innerJoinWith('Users', function ($q){
      return $q->where(['User.id' => $myarea->id]);
}));

【讨论】:

    猜你喜欢
    • 2015-06-19
    • 2016-12-29
    • 2016-04-19
    • 2019-05-18
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 2019-09-07
    相关资源
    最近更新 更多