Ini mungkin cukup mudah tetapi tidak tahu caranya.
Saya memiliki tabel yang dapat memiliki nilai berulang untuk bidang kolom non-kunci tertentu. Bagaimana cara menulis kueri SQL menggunakan Query Builder atau Eloquent yang akan mengambil baris dengan nilai berbeda untuk kolom itu?
Perhatikan bahwa saya tidak mengambil kolom itu saja, ini berhubungan dengan nilai kolom lain, jadi distinct()
mungkin tidak benar-benar berfungsi. Jadi pertanyaan itu pada dasarnya adalah bagaimana menentukan kolom yang ingin saya bedakan dalam kueri sekarang yang distinct()
tidak menerima parameter?
where()
itu rusak, bagaimana cara memperbaikinya?group by
tidak sama dengandistinct
.group by
akan mengubah perilaku fungsi agregat seperticount()
di dalam kueri SQL.distinct
tidak akan mengubah perilaku fungsi tersebut, jadi Anda mendapatkan hasil yang berbeda bergantung pada yang mana yang Anda gunakan.Di Eloquent Anda juga dapat melakukan kueri seperti ini:
$users = User::select('name')->distinct()->get();
sumber
Note that I am not fetching that column only, it is in conjunction with other column values
$users = User::select('column1', 'column2', 'column3')->distinct()->get();
->orderBy('name')
jika Anda ingin menggunakan ini denganchunk
.dengan fasih Anda bisa menggunakan ini
$users = User::select('name')->groupBy('name')->get()->toArray() ;
groupBy sebenarnya mengambil nilai yang berbeda, sebenarnya groupBy akan mengkategorikan nilai yang sama, sehingga kita bisa menggunakan fungsi agregat padanya. tetapi dalam skenario ini kami tidak memiliki fungsi agregat, kami hanya memilih nilai yang akan menyebabkan hasil memiliki nilai yang berbeda
sumber
in_array()
fungsinya, itu tidak pernah berfungsi. Untuk memperbaikinya, saya mencoba->lists()
(Versi 5.2). Jadi,$users = User::select('name')->groupBy('name')->lists('name');
bekerja dengan baik untuk phpin_array()
;Meskipun saya terlambat menjawab ini, pendekatan yang lebih baik untuk mendapatkan rekaman yang berbeda menggunakan Eloquent adalah
$user_names = User::distinct()->get(['name']);
sumber
get()
metode (dan saya juga telah mengujifirst()
metode tersebut), yang setara dengan menggunakanselect()
metode seperti yang ditunjukkan dalam beberapa jawaban di sini. Padahal entah kenapagroupBy
masih nampaknya skor tertinggi. Namun ini akan sangat berbeda jika itu adalah satu-satunya kolom yang saya pilih.$user_names = User::distinct()->count(['name']);
juga bekerjaPengelompokan menurut tidak akan berfungsi jika aturan database tidak mengizinkan salah satu bidang pilihan berada di luar fungsi agregat. Sebagai gantinya gunakan koleksi laravel .
$users = DB::table('users') ->select('id','name', 'email') ->get(); foreach($users->unique('name') as $user){ //.... }
Seseorang menunjukkan bahwa kinerja ini mungkin tidak bagus untuk koleksi besar. Saya akan merekomendasikan menambahkan kunci ke koleksi. Metode yang digunakan disebut keyBy . Ini adalah metode yang sederhana.
$users = DB::table('users') ->select('id','name', 'email') ->get() ->keyBy('name');
KeyBy juga memungkinkan Anda menambahkan fungsi panggilan balik untuk hal-hal yang lebih kompleks ...
$users = DB::table('users') ->select('id','name', 'email') ->get() ->keyBy(function($user){ return $user->name . '-' . $user->id; });
Jika Anda harus mengulangi koleksi besar, menambahkan kunci untuk itu menyelesaikan masalah kinerja.
sumber
Perhatikan bahwa
groupBy
seperti yang digunakan di atas tidak akan berfungsi untuk postgres.Menggunakan
distinct
mungkin merupakan pilihan yang lebih baik - mis$users = User::query()->distinct()->get();
Jika Anda menggunakan
query
Anda dapat memilih semua kolom seperti yang diminta.sumber
**
Diuji untuk Laravel 5.8
**
Karena Anda ingin mendapatkan semua kolom dari tabel, Anda dapat mengumpulkan semua data dan kemudian memfilternya menggunakan fungsi Koleksi yang disebut Unik
// Get all users with unique name User::all()->unique('name')
atau
// Get all & latest users with unique name User::latest()->get()->unique('name')
Untuk informasi lebih lanjut, Anda dapat memeriksa Dokumentasi Koleksi Laravel
EDIT: Anda mungkin memiliki masalah dengan kinerja, dengan menggunakan Unique () Anda akan mendapatkan semua data terlebih dahulu dari tabel Pengguna, dan kemudian Laravel akan memfilternya. Cara ini tidak baik jika Anda memiliki banyak data Pengguna. Anda dapat menggunakan pembuat kueri dan memanggil setiap bidang yang ingin Anda gunakan, contoh:
User::select('username','email','name')->distinct('name')->get();
sumber
$users = User::select('column1', 'column2', 'column3')->distinct()->get();
mengambil ketiga coulmn untuk baris yang berbeda dalam tabel. Anda dapat menambahkan kolom sebanyak yang Anda inginkan.sumber
Saya menemukan metode ini bekerja dengan cukup baik (bagi saya) untuk menghasilkan array datar dengan nilai unik:
$uniqueNames = User::select('name')->distinct()->pluck('name')->toArray();
Jika Anda menjalankan
->toSql()
pembuat kueri ini, Anda akan melihatnya menghasilkan kueri seperti ini:select distinct `name` from `users`
Ini
->pluck()
ditangani oleh illuminate \ collection lib (bukan melalui query sql).sumber
Saya mengalami masalah yang sama saat mencoba mengisi daftar semua utas unik yang dimiliki pengguna dengan pengguna lain. Ini melakukan trik untuk saya
Message::where('from_user', $user->id) ->select(['from_user', 'to_user']) ->selectRaw('MAX(created_at) AS last_date') ->groupBy(['from_user', 'to_user']) ->orderBy('last_date', 'DESC') ->get()
sumber
$users = Users::all()->unique('name');
sumber
Bagi yang menyukai saya melakukan kesalahan yang sama. Berikut adalah jawaban yang diuraikan Diuji di Laravel 5.7
A. Catatan di DB
Array ( [0] => Array ( [id] => 2073 [type] => 'DL' [url] => 'https://i.picsum.photos/12/884/200/300.jpg' [created_at] => 2020-08-05 17:16:48 [updated_at] => 2020-08-06 18:08:38 ) [1] => Array ( [id] => 2074 [type] => 'PROFILE' [url] => 'https://i.picsum.photos/13/884/200/300.jpg' [created_at] => 2020-08-05 17:20:06 [updated_at] => 2020-08-06 18:08:38 ) [2] => Array ( [id] => 2076 [type] => 'PROFILE' [url] => 'https://i.picsum.photos/13/884/200/300.jpg' [created_at] => 2020-08-05 17:22:01 [updated_at] => 2020-08-06 18:08:38 ) [3] => Array ( [id] => 2086 [type] => 'PROFILE' [url] => 'https://i.picsum.photos/13/884/200/300.jpg' [created_at] => 2020-08-05 19:22:41 [updated_at] => 2020-08-06 18:08:38 ) )
B. Hasil Kelompok yang Diinginkan
Array ( [0] => Array ( [type] => 'DL' [url] => 'https://i.picsum.photos/12/884/200/300.jpg' [updated_at] => 2020-08-06 18:08:38 ) [1] => Array ( [type] => 'PROFILE' [url] => 'https://i.picsum.photos/13/884/200/300.jpg' [updated_at] => 2020-08-06 18:08:38 ) )
Jadi teruskan kolom-kolom itu saja
"select()"
, yang nilainya sama. Sebagai contoh:'type','url'
. Anda dapat menambahkan lebih banyak kolom asalkan memiliki nilai yang sama'updated_at'
.Jika Anda mencoba untuk lulus
"created_at"
atau"id"
masuk"select()"
, maka Anda akan mendapatkan catatan yang sama dengan A. Karena berbeda untuk setiap baris di DB.sumber
// Get unique value for table 'add_new_videos' column name 'project_id' $project_id = DB::table('add_new_videos')->distinct()->get(['project_id']);
sumber
$users = User::all(); foreach($users->unique('column_name') as $user){ code here.. }
sumber