У меня есть такой запрос:
$phsql = "SELECT s.id AS siteId, s.name
FROM site s
INNER JOIN profiles p ON s.id = p.siteId
INNER JOIN users_profiles up ON up.profilesId = p.id
AND p.name = 'admin'
AND up.usersId = 2
";
Который я преобразовал следующим образом в методе модели:
$sites = Site::query()
->innerJoin('Profiles', 'Sites.id = Profiles.siteId')
->innerJoin('UsersProfiles', 'UsersProfiles.profilesId = Profiles.id')
->andWhere('Profiles.name = name')
->andWhere('UsersProfiles.usersId = :usersId:', ['userId' => $admin_id])->execute();
При запуске выдает ошибку:
Профили моделей не могут быть загружены
Заметьте, я запускаю это в течение Site
модель.
Обновить
Я попробовал это:
$sites = $this->modelsManager->createBuilder()
->from('myApp\Models\Site')
->innerJoin('myApp\Models\Profiles','myApp\Models\Site.id = myApp\Models\Profiles.siteId')
->andWhere("myApp\Models\Profiles.name = 'admin' ")
->where("myApp\Models\UsersProfiles.profilesId = 2")
->getQuery()
->execute();
И теперь выдает ошибку:
Неизвестная модель или псевдоним «myApp \ Models \ UsersProfiles» (11) при подготовке: ВЫБЕРИТЕ [myApp \ Models \ Site]. * ИЗ [myApp \ Models \ Site] INNER JOIN [myApp \ Models \ Profiles] ON myApp \ Models \ Site.id = myApp \ Models \ Profiles.siteId ГДЕ myApp \ Models \ UsersProfiles.profilesId = 2
Глядя на ваш код, я вижу две проблемы:
1) -> execute () во второй строке должна выдать ошибку разбора?
->innerJoin('Profiles', 'Sites.id = Profiles.siteId')->execute();
2) Вы должны добавить пространство имен к вашей модели, см. Код ниже.
Рабочий пример запроса:
Objects::query()
->columns([
'Models\Objects.id AS objectID',
'Models\ObjectLocations.id AS locationID',
'Models\ObjectCategories.category_id AS categoryID',
])
->innerJoin('Models\ObjectLocations', 'Models\Objects.id = Models\ObjectLocations.object_id')
->innerJoin('Models\ObjectCategories', 'Models\Objects.id = Models\ObjectCategories.object_id')
->where('Models\Objects.is_active = 1')
->andWhere('Models\Objects.id = :id:', ['id' => 2])
->execute();
Вы можете добавить третий параметр (псевдоним) в ваше отношение, чтобы уменьшить пространство имен и улучшить читабельность кода:
->innerJoin('Models\ObjectLocations', 'loc.object_id = obj.id', 'loc');
Больше информации здесь: https://docs.phalconphp.com/en/latest/api/Phalcon_Mvc_Model_Criteria.html
Также обратите внимание: использование where () и andWhere () добавляет предложения where к вашему запросу. В вашем первом примере запроса предложения находятся во втором операторе соединения, тогда как в вашем запросе Phalcon предложения where добавляются ко всему запросу. Если вы действительно хотите эти условия только для второго соединения, добавьте их ко второму параметру соединения следующим образом:
->innerJoin(
'Models\ObjectCategories',
'Models\Objects.id = Models\ObjectCategories.object_id AND ... AND ... AND ...'
)
Других решений пока нет …