2017-02-03 57 views
0

一個範圍對於模型我有一個複雜的範圍條件,像這樣的一部分:查詢的關係,是不是在Laravel

class Foo { 
    public function scopeActive(Builder $query) { 
     $dateNow = $now->format('Y-m-d'); 
     $timeNow = $now->second(0)->format('H:i:s'); 
     $query->whereNull('start_date') 
      ->orWhere('start_date', '<', $dateNow) 
      ->orWhere(function (Builder $query) use ($dateNow, $timeNow) { 
       $query->where('start_date', '=', $dateNow) 
        ->where('start_time', '>=', $timeNow); 
      }); 
    } 
} 

這種複雜的情況將選擇所有在Foo被認爲處於活動狀態的記錄(在真正的範圍比這更復雜)。

我有另一個類,像這樣:

class Bar { 
    public function foos() { 
     return $this->hasMany(Foo::class); 
    } 
} 

這意味着Bar模型有很多Foo車型。

現在,如果我想獲得的所有Bar模型,以及所有活動Foo模型屬於它,我可以做到以下幾點:

Bar::with(['foo', function (HasMany $query) { 
    $query->active(); 
})->get(); 

但是,我怎麼可以編寫一個查詢,讓我所有的Bar記錄是不活躍的。

理想我想是這樣的:

Bar::with(['foo', function (HasMany $query) { 
    $query->whereNot(function (Builder $query) { 
     $query->active(); 
    }); 
})->get(); 

回答

0

似乎沒有成爲一個高效的方式輕鬆顛倒SQL使用Laravel進行復雜的查詢。

你只好得寫出反過來。

0

如果你想有一個範圍是剛好相反,它只是創造另一個範圍的方法,像這樣,但倒查詢邏輯(你不包括您的「有些複雜的查詢」,所以這只是一個猜測):

public function scopeInactive($query) { 
    return $query->where('is_active', false); 
} 

Laravel: local scopes

+0

我稍微編輯它以提供一個複雜範圍的概念。真正的更復雜。因此,我不想再重複一遍 –

+0

不幸的是,無法翻轉示波器。這意味着你必須寫出完全相同的複雜查詢,但是要反向邏輯。 – Jeffrey

+0

一個更好的主意是執行以下操作: 爲模型添加一個額外的屬性(例如'is_active')。然後,設置定期更新數據庫的計劃。例如:每個小時,查詢所有'太舊'的_models_並將它們的'is_active'屬性設置爲false。然後,您將可以使用一個簡單的範圍來確定您的_model_是否處於活動狀態。 – Jeffrey