Переписать столбцы после установки их в области действия

Я написал область, которая ограничивает все запросы к модели. Эти результаты должны содержать только те данные, которые могут быть видны вошедшему в систему пользователю. Чтобы ограничить такой запрос, я присоединяюсь к пользовательской таблице и ограничиваю результаты по идентификатору IN (?,?,?,?,?,?,?,?). Далее в этой области я использую select([BASETABLE . '.*']), потому что мне не нужны данные партнерского присоединения. Пока здесь все работает нормально. Если я использую эту модель и изменю столбцы на то, что мне нужно в этом случае, столбцы сохранят определение из моей области. Я не могу перезаписать их позже.

У кого-нибудь есть решение или идея?

Я уже просмотрел классы (MysqlProcessor, MysqlConnection, Model, Eloquent\Builder, Query\Builder,...) laravel, но не могу найти решение.

// in scope called method to restrict
public function restrictByIds (Builder $query, Model $model)
{
    $ids = $this->getIdsByUser(); // [1,2,3,4,5,6]
    if (!empty($ids)) {
        $userModel = $model->user()->getModel();
        $userTable = $userModel->getTable();

        $query
            ->getQuery()
            ->select([$model->getTable() . '.*'])
            ->join(
                $userTable,
                $userTable . '.id',
                '=',
                $model->getTable() . '.user_id'
            )
            ->whereIn($userTable . '.id', $ids);
    }
}




// tries to overwrite columns
$model->getQuery()->select(['DATE(created) as time', 'count(*) AS count']);
$model->getQuery()->columns = ['DATE(created) as time', 'count(*) AS 
count'];
$model->getQuery()->addSelect(['DATE(created) as time', 'count(*) AS 
count']);
$model->getQuery()->addBinding(['DATE(created) as time', 'count(*) AS 
count'], 'select');
$model->getQuery()->bindings = ['select' => ['DATE(created) as time',
'count(*) AS count']];
$model->select(\DB::raw('DATE(created) as time, count(*) AS count'));
$model->columns = ['DATE(created) as time', 'count(*) AS count'];
$model->addSelect(\DB::raw('DATE(created) as time, count(*) AS count'));
$model->addBinding(['DATE(created) as time', 'count(*) AS count'], 
'select');
$model->bindings = ['select' => ['DATE(created) as time', 'count(*) AS 
count']];

Вы можете сделать это в простом SQL без объединения, поскольку user_id существует как внешний ключ (в таблице, которую вы хотите), хотя я не знаю о Laravel, но в других ORM, которые я использовал, они заставляют вас выполнять соединение. Что меня очень раздражает.. WHERE user_id IN(....)

ArtisticPhoenix 18.02.2019 18:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
31
1

Ответы 1

Я нашел решение. $модель = Модель::запрос() возвращает Eloquent\Builder с активной областью. Для определения столбцов я использую $модель->getQuery()->выбрать(). Для любых других функций (where, whereIn, orderBy, groupBy, ...) может использоваться сам $модель. Таким образом, я получаю свои пользовательские столбцы с автоматическим ограничением.

И используйте $model->getQuery()->addSelect в областях вместо $model->getQuery()->выбрать.

Другие вопросы по теме