Подставленние значений в структуру при запросе сущности

Статус
В этой теме нельзя размещать новые ответы.

Spark108

Проверенные
Сообщения
486
Реакции
950
Баллы
5,675
Есть сущность, допустим такая:

PHP:
<?php

namespace S108DMXFE\Entity;

use XF\Mvc\Entity\Entity;
use XF\Mvc\Entity\Structure;

class Server extends Entity
{
    public static function getStructure(Structure $structure)
    {
        $structure->table = 's108dmxfe_server';
        $structure->shortName = 'S108DMXFE:Server';
        $structure->primaryKey = 'server_id';
        $structure->columns = [
            'server_id' => ['type' => self::UINT,'autoIncrement' => true, 'nullable' => true],
            'name' => ['type' => self::STR],
            'title' => ['type' => self::STR],
            'admin_user_ids' => ['type' => self::SERIALIZED],
            'port' => ['type' => self::UINT],
            'address' => ['type' => self::STR],
            'description' => ['type' => self::STR],
            'table_permissions' => ['type' => self::STR],
            'active' => ['type' => self::BOOL]
        ];

        return $structure;
    }
}

Выполняю запрос через Finder.
\XF::finder('S108DMXFE:Server')

В структуре указана таблица $structure->table = 's108dmxfe_server';, но дело в том, что мне нужно выполнить запрос к таблице, имя которой получается в процессе другого запроса. И тут вопрос. Можно ли передавать в каком-то параметре название таблицы при вызове сущности или может другой вариант есть. В общем я только начинаю разбираться в XF2, по этому многого не понимаю.
 
Spark108, .ну выбирай любой метод
Ну так разве ты не о методах получения из финдера говоришь, это я и так знаю. Динамический запрос через финдер значит не выйдет, через репозиторий делать или через прямой запрос из контроллера...
 
Хотя еще можно попробовать сделать свою обвертку над Finder и создать метод изменения таблицы, но это извращение скорее всего...

Spark108, .какой нахер динамический запрос. Тебе изначально не известно, какая таблица будет. Через репозиторий. Контроллеры не для этого. Смотри абстрактные классы, чтобы найти себе нужный метод.
Уже просматриваю классы. Спасибо за совет.
 
Немного покопавшись всё же нашел ответ на свой вопрос.

Вот так можно динамически создать сущность.

PHP:
        $structure = new Structure;
        $structure->table = 'ИмяТаблицы';
        $structure->shortName = 'S108DMXFE:IConomy';
        $structure->primaryKey = 'id';
        $structure->columns = [
            'id' => ['type' => self::UINT,'autoIncrement' => true, 'nullable' => true],
            'username' => ['type' => self::STR],
            'balance' => ['type' => self::FLOAT],
        ];
       
        $finder = new \XF\Mvc\Entity\Finder(\XF::em(), $structure);
 
Господи...

Я же ещё раньше сказал как сделать
PHP:
<?php

namespace XFRM\Entity;

use XF\Mvc\Entity\Entity;
use XF\Mvc\Entity\Structure;

class ResourceDownload extends Entity
{
    public static function getStructure(Structure $structure)
    {
        $structure->table = 'xf_rm_resource_download';
        $structure->shortName = 'XFRM:ResourceDownload';
        $structure->primaryKey = 'resource_download_id';
        $structure->columns = [
            'resource_download_id' => ['type' => self::UINT, 'autoIncrement' => true, 'nullable' => true],
            'resource_version_id' => ['type' => self::UINT, 'required' => true],
            'user_id' => ['type' => self::UINT, 'required' => true],
            'resource_id' => ['type' => self::UINT, 'required' => true],
            'last_download_date' => ['type' => self::UINT, 'default' => \XF::$time]
        ];
        $structure->getters = [];
        $structure->relations = [
            'Resource' => [
                'entity' => 'XFRM:ResourceItem',
                'type' => self::TO_ONE,
                'conditions' => 'resource_id',
                'primary' => true
            ],
            'Version' => [
                'entity' => 'XFRM:ResourceVersion',
                'type' => self::TO_ONE,
                'conditions' => 'resource_version_id',
                'primary' => true
            ],
            'User' => [
                'entity' => 'XF:User',
                'type' => self::TO_ONE,
                'conditions' => 'user_id',
                'primary' => true
            ],
        ];

        return $structure;
    }
}
JavaScript:
    /**
     * @param $userId
     * @return \XF\Mvc\Entity\Finder
     */
    public function findResourcesDownloadByUser($userId)
    {
        $resourceFinder = $this->finder('XFRM:ResourceDownload');
        $resourceFinder->with(['Resource', 'User'])
            ->where('user_id', $userId)
            ->setDefaultOrder('last_download_date', 'desc');

        return $resourceFinder;
    }
Результат
string(515) " SELECT `xf_rm_resource_download`.*, `xf_rm_resource_Resource_1`.*, `xf_user_User_2`.* FROM `xf_rm_resource_download` LEFT JOIN `xf_rm_resource` AS `xf_rm_resource_Resource_1` ON (`xf_rm_resource_Resource_1`.`resource_id` = `xf_rm_resource_download`.`resource_id`) LEFT JOIN `xf_user` AS `xf_user_User_2` ON (`xf_user_User_2`.`user_id` = `xf_rm_resource_download`.`user_id`) WHERE (`xf_rm_resource_download`.`user_id` = 1) ORDER BY `xf_rm_resource_download`.`last_download_date` DESC LIMIT 1"
 
А потом на форуме выскакивают эксперты по сайтам-визиткам и говорят. Как же бомбит у меня от Entities, finders, and repositories, учитывая, что первое это что то бывшего DataWriter
Ага, привет :world:
нужно сесть и разобраться
.. и понять, что текущая реализация relations куда удобнее горбатых JOIN`ов с толпой исключений в одной куче, как было (лично у меня) в прошлой версии.
Captain беру свои слова назад, мне стоило чуть углубиться и бомбёшка сменилась на радость

P.S. Камень в огород: документация поверхностная. Периодически приходиться идти в сорцы и понимать как делать, к примеру, множественные сортировки:
$finder->setDefaultOrder(array(array('param1', 'ASC'), array('param2', 'DESC')));
 
Конкретно это не рассматривалось и можно открыть файл движка
PHP:
public function findUserBansForList()
    {
        return $this->finder('XF:UserBan')
            ->setDefaultOrder([['ban_date', 'DESC'], ['User.username']]);
    }
P.S массивы вида array не актуальны и принимается везде единый стандарт вида []. К тому же устарело
И да можно ->setDefaultOrder($resourceFinder->expression());
Все сделано максимально удобно и просто работой с IDE и переход по классам. Уж это и так в состояние понять сделать можно
 
P.S. Камень в огород: документация поверхностная. Периодически приходиться идти в сорцы и понимать как делать
В том то и дело, что приходится. Не жить нам на готовеньком, всё самим искать.

По сути я нашел, что искал. По этому тему можно и прикрыть.
 
Статус
В этой теме нельзя размещать новые ответы.
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу