Rangkaian Laravel Eloquent Query Builder memengaruhi kueri dasar asli [duplikat]
Bagaimana saya bisa mendapatkan kueri ini untuk bekerja?
$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.
Bagaimana saya kemudian, memiliki koleksi dasar sebagai titik awal yang tidak akan diubah oleh operasi get () berikutnya.
Terima kasih!
Jawaban
Jika Anda memiliki pembuat dan menginginkan salinan baru dari pembuat tersebut sehingga Anda dapat terus membuat kueri darinya, Anda dapat "menggandakan" pembuat:
$cloned = clone $query;
Sekarang $cloned
adalah objeknya sendiri dan Anda dapat membuat kueri seperti yang Anda inginkan tanpa memengaruhi $query
pembuat aslinya.
Jika Anda benar-benar menginginkan clone
metode pada pembangun dan itu tidak ada, Anda dapat membuat makro:
Illuminate\Database\Query\Builder::macro('clone', function () {
return clone $this;
});
Anda bisa membuangnya dalam boot
metode Penyedia Layanan .
Ada metode klon yang tersedia di pembangun (Illuminate \ Database \ Query \ Builder) yang dapat digunakan
$basic_query = Invoices::between_days(15, 7); $paid_invoices = $basic_query->clone()->paid()->get(); $outstanding_invoices = $basic_query->clone()->paid(false)->get();
Memperbarui
Untuk verifikasi Laravel di bawah 8.xa, makro dapat ditentukan di AppServiceProvider atau metode MacroServiceProvider baru - boot.
Dengan MacroServiceProvider - jangan lupa untuk menambahkannya ke array penyedia di 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()
{
//
}
}