Не удалось загрузить модель при выполнении запроса

У меня есть такой запрос:

$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

3

Решение

Глядя на ваш код, я вижу две проблемы:

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 ...'
)
3

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

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

По вопросам рекламы [email protected]