【发布时间】: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