1

各試験には 1 つのシラバスがあり、各シラバスには 1 つの試験があります。だから、私はこれを試験モデルで行いました:

public $hasOne = 'Syllabuses'; //table: syllabuses, model: Syllabuses

私がこれをしたからUsersController

public $uses = array('Setting', 'Exam', 'Syllabuses');

そして、メソッドでUsersControllerpaginate を呼び出したい:

$options = array(
    'fields' => array('Exam.id', 'Exam.name', 'Syllabuses.id', 'Syllabuses.name', 'Syllabuses.syllabus', 'Syllabuses.last_updated'),
    'joins' => array(
        'table' => 'syllabuses',
        'conditions' => array('Exam.id = Syllabuses.exam_id')
    )
);
$this->paginate = $options;
$this->set('syllabuses', $this->Paginator->paginate('Syllabuses'));

試験表:

---+------+
id | name |
---+------+

およびシラバス表:

---+---------+------+----------+--------------+
id | exam_id | name | syllabus | last_updated |
---+---------+------+----------+--------------+

だから、私はいくつかのエラーが発生しました。このような:

エラー: SQLSTATE[42000]: 構文エラーまたはアクセス違反: 1064 SQL 構文にエラーがあります。Near 'syllabuses Array LEFT JOIN を使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してくださいoessyllabusesAS SyllabusesON ( Syllabuses.`' at line 1

そして、CakePHP が準備した私の SQL は次のとおりです。

SELECT `Exam`.`id`, `Exam`.`name`, `Syllabuses`.`id`, `Syllabuses`.`name`, `Syllabuses`.`syllabus`, `Syllabuses`.`last_updated` 
FROM `oes`.`exams` AS `Exam` syllabuses Array 
LEFT JOIN `oes`.`syllabuses` AS `Syllabuses` ON (`Syllabuses`.`exam_id` = `Exam`.`id`)
WHERE 1 = 1 LIMIT 20

しかし、私が欲しいのは、以下のクエリのようなものです。私はmysqlでそれをテストしました:

SELECT  `Exam`.`id` AS eid,  `Exam`.`name` AS ename,  `Syllabuses`.`id` AS sid,  `Syllabuses`.`name` AS sname,  `Syllabuses`.`syllabus` ,  `Syllabuses`.`last_updated` 
FROM  `oes`.`syllabuses` AS  `Syllabuses` , exams AS Exam
WHERE Exam.id = Syllabuses.exam_id
ORDER BY Exam.id
LIMIT 20

今、誰でも私がこれを達成するのを手伝ってください。どのような変更を行うと、CakePHP がそのようなクエリを準備できるようになりますか (私が味わったもの)、やり遂げることができますPagination

4

1 に答える 1

2

わかりました、これは多くのプログラマーにとって役立つと思います。だからこそ、私が最終的にやったことを共有したいのです:

$options = array(
    'fields' => array(
        'Exam.id',
        'Exam.name',
        'Syllabuses.id',
        'Syllabuses.name',
        'Syllabuses.exam_id',
        'Syllabuses.syllabus',
        'Syllabuses.last_updated'
    ),
    'recursive' => 0,
    'conditions' => array('Exam.id = Syllabuses.exam_id'),
    'limit' => 3
);
$this->paginate = $options;
$syllabuses = $this->Paginator->paginate('Exam');
于 2013-09-26T06:36:03.690 に答える