第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

優(yōu)雅地退出 Laravel 作用域

優(yōu)雅地退出 Laravel 作用域

PHP
繁星點點滴滴 2023-08-19 09:47:18
我有一個范圍,它根據(jù)用戶角色以限制方式起作用,您可以將一組規(guī)則轉(zhuǎn)發(fā)到限制數(shù)據(jù)庫最終輸出的范圍。一個非常簡化的角色限制示例:{    "first_name": "=foo%"}只會返回first_name以 開頭的記錄foo%,這實際上意味著我已禁止具有該角色的用戶查看任何不以 開頭的記錄foo%。這種方法的問題在于,如果某人沒有施加任何限制,他就會看到一切。我知道這是一個有效的假設(shè),但如果沒有施加限制,我想禁止一切,這樣如果創(chuàng)建了新角色,它就沒有任何權(quán)利。目前我正在針對這種情況拋出異常:public function apply(Builder $builder, Model $model){    $input = $this->getAuthValues(get_class($model));    if (count($input) < 1) {        throw new \Exception('No rights for you');    }    $jsonQuery = new JsonQuery($builder, $input); <-- class responsible for assembling the queries based on the input    $jsonQuery->search();}但這當(dāng)然也不例外。在這種情況下我希望返回空數(shù)組。我可以使用某種方法來優(yōu)雅地退出范圍并返回空結(jié)果,而無需在之后實際執(zhí)行查詢嗎?
查看完整描述

2 回答

?
Cats萌萌

TA貢獻1805條經(jīng)驗 獲得超9個贊

我找到了一個解決方案來進行不可能的查詢,該查詢將返回 0 結(jié)果。


public function apply(Builder $builder, Model $model)

{

    $input = $this->getAuthValues(get_class($model));


    if (count($input) < 1) {

        $builder->whereRaw('1 = 0');

        return;

    }


    $jsonQuery = new JsonQuery($builder, $input);

    $jsonQuery->search();

}


查看完整回答
反對 回復(fù) 2023-08-19
?
明月笑刀無情

TA貢獻1828條經(jīng)驗 獲得超4個贊

由于作用域通常是鏈接的(稱為流暢),并且作用域不直接負(fù)責(zé)執(zhí)行查詢,因此我認(rèn)為您不能“優(yōu)雅地退出”,因為下一個調(diào)用仍然需要一個對象來處理Builder。


一種可能的解決方案(并不簡單)是創(chuàng)建一個擴展該類的類Builder,并重寫負(fù)責(zé)實際從數(shù)據(jù)庫獲取結(jié)果的所有方法。我不確定您需要重寫的所有方法才能在所有情況下都沒有錯誤地工作。您可能還想處理其中的一些插入和更新情況AbortedBuilder。


class AbortedBuilder extends Builder

{

    ...


    /**

     * Run the query as a "select" statement against the connection.

     *

     * @return array

     */

    protected function runSelect()

    {

        return [];

    }

    

    ...


    /**

     * Run a pagination count query.

     *

     * @param  array  $columns

     * @return array

     */

    protected function runPaginationCountQuery($columns = ['*'])

    {

        return [];        

    }


    ...


    /**

     * Insert a new record and get the value of the primary key.

     *

     * @param  array  $values

     * @param  string|null  $sequence

     * @return int

     */

    public function insertGetId(array $values, $sequence = null)

    {

        throw new \Exception('You are trying to insert using an aborted query!');

    }


    ...

}

然后在你的范圍內(nèi)你可以這樣做:


public function apply(Builder $builder, Model $model)

{

    $input = $this->getAuthValues(get_class($model));


    if (count($input) < 1) {

        $builder = new AbortedBuilder();

    } else {

        $jsonQuery = new JsonQuery($builder, $input);

        $jsonQuery->search();

}


查看完整回答
反對 回復(fù) 2023-08-19
  • 2 回答
  • 0 關(guān)注
  • 185 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號