Laravel Advanced Değişken işleve nasıl aktarılır?


87

Dokümandaki örnek:

DB::table('users')
        ->whereExists(function($query)
        {
            $query->select(DB::raw(1))
                  ->from('orders')
                  ->whereRaw('orders.user_id = users.id');
        })
        ->get();

Ama ya böyle bir harici değişken kullanmam gerekirse:

            ->where('city_id', '=', $this->city->id)
            ->where(function($query)
                {
                    $query->where('name', 'LIKE', '%'.$searchQuery.'%')
                    ->orWhere('address', 'LIKE', '%'.$searchQuery.'%')

                })

Şimdilik yeni bir mülk oluşturdum ve ona eriştim $this->, ancak daha uygun bir yol var mı?

Yanıtlar:


231

useAnahtar kelime ile üst kapsamdaki gerekli değişkenleri kapanışa aktarabilirsiniz .

Örneğin:

DB::table('users')->where(function ($query) use ($activated) {
    $query->where('activated', '=', $activated);
})->get();

Daha fazlası burada .

EDIT (2019 güncellemesi):

PHP 7.4 ( 28 Kasım 2019'da piyasaya sürülecek ) , ok işlevleri adı verilen anonim işlevlerin daha kısa bir varyasyonunu sunarak bunu biraz daha az ayrıntılı hale getiriyor.

İşlevsel olarak neredeyse eşdeğer olan PHP 7.4 kullanan bir örnek (aşağıdaki 3. madde işaretine bakın):

DB::table('users')->where(fn($query) => $query->where('activated', '=', $activated))->get();

Normal sözdizimiyle karşılaştırıldığında farklılıklar:

  • fnyerine anahtar kelime function.
  • Üst kapsamdan alınması gereken tüm değişkenleri açıkça listelemeye gerek yoktur - bu artık otomatik olarak değere göre yapılır. useİkinci örnekte anahtar kelime eksikliğine bakın .
  • Ok işlevleri her zaman bir değer döndürür. Bu aynı zamanda voidonları bildirirken dönüş türünü kullanmanın imkansız olduğu anlamına gelir .
  • returnAnahtar kelime olmalıdır atlanabilir.
  • Ok işlevlerinin return ifadesi olan tek bir ifadesi olmalıdır . Çok satırlı işlevler şu anda desteklenmemektedir. Yine de yöntemleri zincirleyebilirsiniz.

15

@kajetons'un cevabı tamamen işlevsel.

Birden çok değişkeni aşağıdaki gibi geçirerek de iletebilirsiniz: use($var1, $var2)

DB::table('users')->where(function ($query) use ($activated,$var2) {
    $query->where('activated', '=', $activated);
    $query->where('var2', '>', $var2);
})->get();

5

Laravel eloquent kullanıyorsanız, bunu da deneyebilirsiniz.

$result = self::select('*')
                    ->with('user')
                    ->where('subscriptionPlan', function($query) use($activated){
                        $query->where('activated', '=', $roleId);
                    })
                    ->get();

2

Bunu kullanarak değişkenleri aktarabilirsiniz ...

$status =1;
 $info = JOBS::where(function($query) use ($status){        
         $query->where('status',$status);
         })->get();
print_r($info);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.