后端列表过滤器以切换全局范围

时间:2017-03-29 09:42:27

标签: octobercms

我有一个职位空缺模型,其全球范围只显示空缺职位,但在后端我需要一个复选框来切换这个空缺,以便显示所有职位空缺。复选框类型似乎只适用于本地范围。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

您可以在模型上设置一个删除全局范围的本地范围。

类似的东西:

public function scopeAllVacancies($query)
{
    // This is not actually how you remove a global scope,
    // see https://softonsofa.com/laravel-5-eloquent-global-scope-how-to/
    // for more information.
    $query->removeScope(MyGlobalScope);
}

作为旁注,您无法使用https://softonsofa.com/laravel-5-eloquent-global-scope-how-to/中建议的删除方法,因为列表小部件通过引用使用对象,并且不会听取返回值这个范围。因此,为了将其删除(至少在我们实现某种形式的$query->resetQuery()$query->removeScope($scope)之前),您必须在查询对象上手动删除范围。

以下是直接与查询对象进行交互以手动删除范围的示例:

/**
 * Removes the provided orderby column rule from the QueryBuilder orders array to reset the orderBy for that column
 *
 * @param Builder $query
 * @param string $orderByColumn
 * @return Builder $query
 */
public function scopeRemoveOrder($query, $orderByColumn)
{
    // Orders property can have mixed up integer index, flatten the array to negate any weird keys in this array
    $orders = $query->getQuery()->orders;
    if (is_array($orders)) {
        $orders = array_values($query->getQuery()->orders);
        $i = 0;
        foreach ($orders as $order) {
            if ($order['column'] === $orderByColumn) {
                unset($orders[$i]);
            }
            $i++;
        }
        $query->getQuery()->orders = $orders;
    }
    return $query;
}