Конвертировать из запроса в ModelSearch из Yii2

Я новичок в Yii2, и у меня есть запрос с правильным результатом:

SELECT DISTINCT workloadTeam.project_id, wp.project_name, workloadTeam.user_id, workloadTeam.commit_time, wp.workload_type FROM
(SELECT p.id, p.project_name, w.user_id, w.commit_time, w.comment, w.workload_type
FROM workload as w, project as p
WHERE w.user_id = 23 AND p.id = w.project_id) wp
INNER JOIN workload as workloadTeam ON wp.id = workloadTeam.project_id

Но в моем ModelSearch.php я написал:

$user_id = Yii::$app->user->id;

$subquery = Workload::find()->select('p.id', 'p.project_name', 'w.user_id', 'w.commit_time', 'w.comment', 'w.workload_type')
->from(['project as p', 'workload as w'])
->where(['user_id' => $user_id, 'p.id' => 'w.project_id']);

$query = Workload::find()
->select(['workloadTeam.project_id', 'wp.project_name', 'workloadTeam.user_id', 'workloadTeam.from_date', 'workloadTeam.to_date', 'workloadTeam.workload_type', 'workloadTeam.comment'])
->where(['', '', $subquery]);

$query->join('INNER JOIN', 'workload as workloadTeam', 'wp.id = workloadTeam.project_id');

Произошла ошибка:

SELECT COUNT(*) FROM `workload` INNER JOIN `workload` `workloadTeam` ON wp.id = workloadTeam.project_id WHERE `` (SELECT p.project_name `p`.`id` FROM `project` `p`, `workload` `w` WHERE (`user_id`=20) AND (`p`.`id`='w.project_id'))

И я не могу исправить это с правильным запросом выше.
У вас есть решение по этому поводу?

3

Решение

Эта ошибка отображается на панели инструментов Yii-debug? Тогда ваш запрос (который вы упомянули как ошибку), вероятно, является только счетом из запроса, который указан ранее.

Вы пропустили добавить подзапрос в from пункт, как вы показали в вашем рабочем sql. Добавьте это в свой where пункты были просто не в том месте. Поместите подзапросы в whereусловия, если у вас есть скалярные результаты, потому что вы должны использовать этот результат с операндами, как =, >=, in

Это может сработать:

$user_id = Yii::$app->user->id;

$subquery = Workload::find()->select([
'p.id as id',
'p.project_name as project_name',
'w.user_id as user_id',
'w.commit_time as commit_time',
'w.comment as comment',
'w.workload_type as workload_type'
])
->from([
'project as p',
'workload as w'
])
->where([
'user_id' => $user_id,
'p.id' => 'w.project_id'
]);

$query = Workload::find()
->select([
'workloadTeam.project_id',
'wp.project_name',
'workloadTeam.user_id',
'workloadTeam.from_date',
'workloadTeam.to_date',
'workloadTeam.workload_type',
'workloadTeam.comment'
])
->from([$subquery => 'wp']); //you were missing this line

$query->join('INNER JOIN', 'workload as workloadTeam', 'wp.id = workloadTeam.project_id');

Но вы не используете выбор из вашего workload таблица в вашем основном запросе $query

Поскольку я не знаю, какова ваша цель, я не могу помочь вам в этой теме …

1

Другие решения

Других решений пока нет …