【问题标题】:Rewrite columns after setting it in scope在范围内设置列后重写列
【发布时间】:2019-02-18 17:21:00
【问题描述】:

我写了一个作用域来限制模型上的所有查询。 这些结果应该只包含登录用户可以看到的数据。 为了限制这样的查询,我加入了一个用户表并通过 id IN (?,?,?,?,?,?,?,?) 限制结果。 在该范围内,我使用 select([BASETABLE . '.*']) 因为我不希望合作伙伴加入的数据。 直到这里一切正常。 如果我使用该模型并将列更改为在这种情况下所需的列,则列会将定义保留在我的范围内。我以后无法覆盖它们。

有人有解决方案或想法吗?

我已经研究过 laravel 的类(MysqlProcessor、MysqlConnection、Model、Eloquent\Builder、Query\Builder,...),但找不到解决方案。

// 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(....)

标签: php laravel eloquent scope


【解决方案1】:

我找到了解决方案。 $model = Model::query() 返回具有活动范围的 Eloquent\Builder。 要定义列,我使用 $model->getQuery()->select()。 对于任何其他函数(where、whereIn、orderBy、groupBy、...)$model 本身都可以使用。 通过这种方式,我获得了带有自动限制的自定义列。

并在作用域中使用 $model->getQuery()->addSelect 而不是 $model->getQuery()->select

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-07
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多