CakePHP 5.x: двойной leftJoinWith()Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 CakePHP 5.x: двойной leftJoinWith()

Сообщение Anonymous »

В моем приложении ActivityCategories есть () Действия и Действия имеют (

Код: Выделить всё

belongsToMany
с помощью joinTable) Пациенты:

Код: Выделить всё

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.
Это работает правильно, и свойство 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();
Здесь происходит что-то странное: свойство total_for_phase (относительно второго добавленного мной leftJoinWith()) сообщает правильный счетчик.
Но предыдущее час сообщает о результате, который кажется почти случайным (непредсказуемым).
Что я делаю не так? Как мне поступить? Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/786 ... ftjoinwith
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»