2017-10-13 61 views
0

上下文:
我正在使用CakePHP 3.x,並且正在嘗試構建帶分頁的ORM查詢。我有表用戶,主題和區域。用戶可以有很多主題,但只有一個區域。這是DB模式:CakePHP 3.x查詢許多帶分頁的Table對象

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']); 

我得到噸的錯誤,我不知道如何才能正確地構建查詢。

+0

您可以張貼什麼錯誤,你讓他們中的至少一種? – KaffineAddict

回答

0

乍一看,有至少一個錯誤:

$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]); 
}));