Код: Выделить всё
hasManyКод: Выделить всё
belongsToManyКод: Выделить всё
class ActivitiesCategoriesTable extends Table
{
public function initialize(array $config): void
{
// ...
$this->hasMany('Activities', [
'foreignKey' => 'activities_category_id',
]);
// ...
}
}
class ActivitiesTable extends Table
{
public function initialize(array $config): void
{
// ...
$this->belongsTo('ActivitiesCategories', [
'foreignKey' => 'activities_category_id',
'joinType' => 'INNER',
]);
$this->belongsToMany('Patients', [
'foreignKey' => 'activity_id',
'targetForeignKey' => 'patient_id',
'joinTable' => 'patients_activities',
]);
// ...
}
}
class PatientsTable extends Table
{
public function initialize(array $config): void
{
// ...
$this->belongsToMany('Activities', [
'foreignKey' => 'patient_id',
'targetForeignKey' => 'activity_id',
'joinTable' => 'patients_activities',
]);
// ...
}
}
Например:
в мае 2024 года Марк участвовал в 12 спортивных мероприятиях из
всего 15 (следовательно, отсутствовал в 3)< /p>
Итак, я пытаюсь следовать кулинарной книге, как указано здесь.
Итак, давайте по порядку. Чтобы получить общую активность для каждой категории, я делаю следующее:
(метод find BetweenDateTime использует аргументы $StartOn и $EndOn для ограничения дат активности)
Код: Выделить всё
$Query = $this->Activities->ActivitiesCategories->find();
$results = $Query
->select([
'name',
'total_activities' => $Query->func()->count('Activities.id'),
])
->leftJoinWith('Activities', function (SelectQuery $Query) use ($StartOn, $EndOn): SelectQuery {
return $Query->find('betweenDateTime', StartOn: $StartOn, EndOn: $EndOn);
})
->groupBy(['ActivitiesCategories.id'])
->orderByAsc('name')
->all();
Это работает правильно, и свойство total_activities сообщает мне для каждой категории количество действий между $StartOn и $EndOn.
p>
Теперь пациенты. Я добавляю второй leftJoinWith():
Код: Выделить всё
$Query = $this->Activities->ActivitiesCategories->find();
$results = $Query
->select([
'name',
'total_activities' => $Query->func()->count('Activities.id'),
'total_for_patient' => $Query->func()->count('Patients.id'),
])
->leftJoinWith('Activities', function (SelectQuery $Query) use ($StartOn, $EndOn): SelectQuery {
return $Query->find('betweenDateTime', StartOn: $StartOn, EndOn: $EndOn);
})
->leftJoinWith('Activities.Patients', function (SelectQuery $Query) use ($patientId): SelectQuery {
return $Query->where(['Patients.id' => $patientId]);
})
->groupBy(['ActivitiesCategories.id'])
->orderByAsc('name')
->all();
Но предыдущее час сообщает о результате, который кажется почти случайным (непредсказуемым).
Что я делаю не так? Как мне поступить? Спасибо.
Подробнее здесь: https://stackoverflow.com/questions/786 ... ftjoinwith
Мобильная версия