関連付けテーブル ( ) を介して、スポーツ クラス/コース ( courses
) とそのトレーナー ( ) を選択する SQL ステートメントがあります。一部のコースには複数のトレーナーがいるため、関数を使用してトレーナー名を 1 つのフィールドに取得します。一部のトレーナー行は空 orであるため、トレーナーの句にand条件を追加します。trainers
courses_trainers
GROUP_CONCAT(...)
NULL
trainers.name IS NOT NULL
trainers.name != ""
ON
JOIN
SQL
声明
SELECT
courses.id AS id,
GROUP_CONCAT(DISTINCT trainers.name SEPARATOR "|||") AS trainers
...
FROM
courses
...
LEFT JOIN
courses_trainers ON courses.id = courses_trainers.course_id
LEFT JOIN
trainers ON trainer_id = trainers.id
AND trainers.name IS NOT NULL
AND trainers.name != ""
...
...
WHERE `courses`.`id` = '898'
GROUP BY
courses.id
;
CourseTable
クラスの OO バリアント
public function findOnceByID($id) {
$concatDelimiter = self::CONCAT_DELIMITER;
$select = new Select();
...
$select->columns(array(
'id', ...
));
$select->from($this->tableGateway->getTable());
$select
...
->join('courses_trainers', 'courses.id = courses_trainers.course_id', array(), Select::JOIN_LEFT)
->join('trainers', 'trainer_id = trainers.id AND trainers.name IS NOT NULL AND trainers.name != ""', array(
'trainers' => new Expression('GROUP_CONCAT(DISTINCT trainers.name SEPARATOR "' . $concatDelimiter . '")')
), Select::JOIN_LEFT)
...
;
$where
->equalTo('courses.id', $id)
;
$select->where($where, Predicate::OP_AND);
$select->group('courses.id');
$resultSet = $this->tableGateway->selectWith($select);
return $resultSet;
}
生成されたJOIN
コードは次のようになります。
LEFT JOIN
`courses_trainers` ON `courses`.`id` = `courses_trainers`.`course_id`
LEFT JOIN
`trainers` ON `trainer_id` = `trainers`.`id`
AND `trainers`.`name` `IS` `NOT` `NULL`
AND `trainers`.`name` `!`= `"``"`
だから、ここに多くの引用があります。
などを引用してはならないことIS
をZF に「説明」する方法は?NOT
"