Laravel Eloquent Sorgu Oluşturucu zinciri, orijinal temel sorguyu etkiler [kopya]
Bu sorguyu nasıl çalıştırabilirim?
$basic_query = Invoices::between_days(15, 7); // This is a collection of invoices from 15 days ago, to seven days in the future. Notice I am not getting this query, it´s still just a builder instance. If you do dd($basic_query->get()) you get 100 invoices, 60 of them paid, 40 of them outstanding.
$paid_invoices = $basic_query->paid()->get(); // This returns the collection of 60 paid invoices without problems. BUT MODIFIES $basic query, if you dd($basic query->get()) at this point, you only get the 60 paid invoices, not the full 100 invoices collection. ¿?!!!
$outstanding_invoices = $basic_query->paid(false)->get(); // This query will always be empty, even though there are many outstanding invoices. If you dd($basic_query->get()) at this point, you get an empty collection. The 100 invoices are lost.
O halde, sonraki get () işlemleriyle değiştirilmeyecek bir başlangıç noktası olarak temel bir koleksiyona nasıl sahip olabilirim?
Teşekkür ederim!
Yanıtlar
Bir oluşturucunuz varsa ve oluşturucunun yeni bir kopyasını istiyorsanız, ondan bir sorgu oluşturmaya devam edebilmek için oluşturucuyu "klonlayabilirsiniz":
$cloned = clone $query;
Şimdi $cloned
kendi nesnesi ve sorguyu $query
orijinal kurucu üzerinde bir etkiye sahip olmadan istediğiniz şekilde oluşturabilirsiniz .
clone
Oluşturucuda gerçekten bir yöntem istiyorsanız ve bu mevcut değilse, onu makrolayabilirsiniz:
Illuminate\Database\Query\Builder::macro('clone', function () {
return clone $this;
});
Bunu bir Servis Sağlayıcının boot
yöntemine atabilirsiniz .
Oluşturucuda kullanılabilen bir klon yöntemi vardır (Illuminate \ Database \ Query \ Builder)
$basic_query = Invoices::between_days(15, 7); $paid_invoices = $basic_query->clone()->paid()->get(); $outstanding_invoices = $basic_query->clone()->paid(false)->get();
Güncelleme
8.x'in altındaki Laravel sürümleri için makro AppServiceProvider'da veya yeni bir MacroServiceProvider - önyükleme yönteminde tanımlanabilir.
MacroServiceProvider ile - bunu sağlayıcılar dizisine eklemeyi unutmayın. config/app.php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Database\Query\Builder;
class MacroServiceProvider extends ServiceProvider
{
public function boot()
{
Builder::macro('clone', function() {
return clone $this;
});
}
public function register()
{
//
}
}