Saya punya dua meja, User
dan Post
. Seseorang User
dapat memiliki banyak posts
dan satu post
milik hanya satu user
.
Dalam User
model saya, saya memiliki hasMany
hubungan ...
public function post(){
return $this->hasmany('post');
}
Dan dalam post
model saya, saya memiliki belongsTo
hubungan ...
public function user(){
return $this->belongsTo('user');
}
Sekarang saya ingin bergabung dengan dua tabel ini menggunakan Eloquent with()
tetapi ingin kolom khusus dari tabel kedua. Saya tahu saya bisa menggunakan Pembuat Kueri tetapi saya tidak mau.
Ketika dalam Post
model saya menulis ...
public function getAllPosts() {
return Post::with('user')->get();
}
Ini menjalankan kueri berikut ...
select * from `posts`
select * from `users` where `users`.`id` in (<1>, <2>)
Tapi yang saya inginkan adalah ...
select * from `posts`
select id,username from `users` where `users`.`id` in (<1>, <2>)
Ketika saya menggunakan ...
Post::with('user')->get(array('columns'....));
Itu hanya mengembalikan kolom dari tabel pertama. Saya ingin menggunakan kolom spesifik with()
dari tabel kedua. Bagaimana saya bisa melakukan itu?
$query->select('id','username');
, saya mulaiTrying to get property of non-object
id
dalam hal ini) diperlukan dalam$query->select()
untuk benar-benar mengambil hasil yang diperlukan. Saya menghilangkan ini dalam kode saya dan tidak tahu mengapa tidak menemukan hasil. Saya konyol! Semoga ini bisa membantu orang lain dengan masalah yang samaAnda dapat melakukannya seperti ini sejak Laravel 5.5:
Peduli
id
bidang danforeign keys
sebagaimana dinyatakan dalam dokumen :Misalnya, jika pengguna milik tim dan memiliki
team_id
sebagai kunci kolom asing, maka$post->user->team
kosong jika Anda tidak menentukanteam_id
sumber
get()
metode iniPost::with('user:id,username')->get(['age', 'color']);
Dalam
Post
model AndaKredit asli diberikan ke Laravel Eager Loading - Hanya memuat kolom tertentu
sumber
$fields
parameter.Ketika pergi ke arah lain (hasMany):
Jangan lupa untuk memasukkan kunci asing (dengan asumsi itu adalah user_id dalam contoh ini) untuk menyelesaikan hubungan, jika tidak Anda akan mendapatkan hasil nol untuk hubungan Anda.
sumber
Di Laravel 5.7 Anda dapat memanggil bidang tertentu seperti ini
Penting untuk menambahkan
foreign_key
bidang dalam pemilihan.sumber
Dalam
Post
model Anda :Sekarang kamu bisa menggunakannya
$post->userWithName
sumber
Jika Anda ingin mendapatkan kolom khusus menggunakan
with()
laravel fasih maka Anda dapat menggunakan kode seperti di bawah ini yang semula dijawab oleh @Adam dalam jawabannya di sini sebagai tanggapan atas pertanyaan yang sama:Jadi saya telah menggunakannya dalam kode saya tetapi itu memberi saya kesalahan
1052: Column 'id' in field list is ambiguous
, jadi jika kalian juga menghadapi masalah yang samaMaka untuk menyelesaikannya Anda harus menentukan nama tabel sebelum kolom id dalam
with()
metode seperti kode di bawah ini :sumber
Saya menemukan masalah ini tetapi dengan lapisan kedua benda terkait. @Awais Qarni menjawab dengan memasukkan kunci asing yang sesuai dalam pernyataan pilih bersarang. Sama seperti id diperlukan dalam pernyataan pilih bersarang pertama untuk referensi model terkait, kunci asing diperlukan untuk referensi tingkat kedua model terkait; dalam contoh ini model Perusahaan.
Selain itu, jika Anda ingin memilih kolom tertentu dari model Post, Anda harus menyertakan kolom user_id dalam pernyataan pilih untuk referensi.
sumber
Perhatikan bahwa jika Anda hanya perlu satu kolom dari tabel maka menggunakan 'daftar' cukup bagus. Dalam kasus saya, saya mengambil artikel favorit pengguna tetapi saya hanya ingin artikel id:
Mengembalikan array id, misalnya:
sumber
toArray()
!!!$user->favourites->lists('id')->toArray();
$user->favourites
akan dikembalikanCollection
dengan semua bidang yang dipilih. Penggunaan yang benar adalah:$user->favourites()->lists('id')
.Query\Builder::lists
metode danCollection::lists
metode.Anda juga dapat menentukan kolom pada model terkait pada saat mengaksesnya.
Post::first()->user()->get(['columns....']);
sumber
Sekarang Anda dapat menggunakan
pluck
metode ini padaCollection
contoh:Ini hanya akan mengembalikan
uuid
atributPost model
sumber
Coba dengan ketentuan.
sumber
sumber