Laravel Eloquent: Birleştirilmiş tablolardan yalnızca belirli sütunlar nasıl alınır?


102

Eloquent'te temalar ve kullanıcılar olmak üzere 2 birleşik tablom var.

tema modeli:

public function user() {
  return $this->belongs_to('User');
}

kullanıcı modeli:

public function themes() {
  return $this->has_many('Theme');
}

Eloquent api çağrım aşağıdaki gibi görünüyor:

return Response::eloquent(Theme::with('user')->get());

Bu, temadaki tüm sütunları (sorun değil) ve kullanıcıdan gelen tüm sütunları (iyi değil) döndürür. Kullanıcı modelinden sadece 'kullanıcı adı' sütununa ihtiyacım var, sorguyu bununla nasıl sınırlayabilirim?


Benzer bir görev üzerinde çalışıyorum, Responsene tür bir sınıf içeri aktarmam gerektiğini öğrenebilir miyim?
Agnes Palit

Yanıtlar:


103

Seçmek istediğiniz sütunları belirtmek için modelinizi değiştirin:

public function user() {
  return $this->belongs_to('User')->select(array('id', 'username'));
}

Ve katıldığınız sütunu eklemeyi unutmayın.


6
harika cevap, ayrıca katılma sütununu dahil etme ile ilgili ipucu bana tonlarca zaman kazandırdı!
greatwitenorth

Ya bazı yerlerde hem id hem de kullanıcı adı yerine yalnızca id'ye ihtiyacım olursa? Yine de ikisini birden seçmeniz mi gerekiyor?
Darius.V

Merhaba select işlevi, model sorgu oluşturucuda aynı işleve sahip mi?
Gokigooooks

4
Bunun iyi bir yaklaşım olduğunu düşünmüyorum. Sütun adlarını kodlamak gibi olacak. Tüm yerler yalnızca bu sütunları döndürecektir. Başka bir API'de, daha fazla sütuna ihtiyacım olabilir, böylece burada çalışmaz. Bence QueryBuilder'ı kullanmak buradaki seçenek.
Aman Sura

2
Bu, aramayı her ilerlettiğinizde gerçekleşeceği için dramatik bir yaklaşımdır. Sajjad
Ashraf'ın

37

Laravel için> = 5.2

Kullan > koparmak () - yöntem

$roles = DB::table('roles')->pluck('title');

Tek bir sütunun değerlerini içeren bir dizi almak istiyorsanız, pluck yöntemini kullanabilirsiniz.


Laravel için <= 5.1

Kullan -> listelerini () metodu

$roles = DB::table('roles')->lists('title');

Bu yöntem, bir dizi rol başlığı döndürür. Döndürülen dizi için özel bir anahtar sütunu da belirtebilirsiniz:


2
Bu aslında sorunun cevabı değil (özellikle katılımlar / ilişkiler hakkındaydı).
2017

30

Get parametresinde aşağıdaki gibi bir alan dizisi sağlayabilirsiniz:

return Response::eloquent(Theme::with('user')->get(array('user.username'));

GÜNCELLEME (Laravel 5.2 için) Dokümanlardan bunu yapabilirsiniz:

$response = DB::table('themes')
    ->select('themes.*', 'users.username')
    ->join('users', 'users.id', '=', 'themes.user_id')
    ->get();

2
Bunu denedim ve bir hata gösteriyor SQLSTATE[42S22]: Column not foundve bu SQL, tabloyu with. Hatada görünen sql "SELECT fk_table.column1 FROM main_table" dır.
Michel Ayres

1
"Kullanıcılar.kullanıcıadı" ("kullanıcı.kullanıcıadı" değil). Yanıttaki kod, gerçek veritabanınızla eşleşen tablo ve sütun adlarına sahipseniz çalışacaktır. Bu çözümün dezavantajı bu, Eloquent kullanmak yerine bir SQL sorgusu oluşturması, bu nedenle adların gerçek veritabanı tablolarınız ve sütunlarınızla eşleşmesi gerekir.
2017

22

Biliyorum, Eloquent'i istiyorsun ama bunu Fluent Query Builder ile yapabilirsin

$data = DB::table('themes')
    ->join('users', 'users.id', '=', 'themes.user_id')
    ->get(array('themes.*', 'users.username'));

16

Ben böyle yaparım

$posts = Post::with(['category' => function($query){
        $query->select('id', 'name');
      }])->get();

User2317976 tarafından verilen ilk cevap benim için işe yaramadı, laravel 5.1 kullanıyorum


2
Güncel cevap = yararlı!
thesunneversets

Teşekkürler. Benim için iyi çalışıyor. Yabancı anahtarı 'id' ile yaptığınız gibi select deyimine eklemeliyim, aksi takdirde boş döndürür.
Iman Sedighi

Ancak, bu yine de her sonuç için her iki kimliği (post_id ve category_id) içeren bir "pivot" alanı alır değil mi? Nasıl binebilirim?
mayid

1
@mayid pivot, $ gizli Post Model dizisine eklemeyi deneyebilirsinizprotected $hidden = ['pivot']
Sajjad Ashraf

Bu en iyi çözümdür (Laravel'in oldukça modern bir sürümünü kullandığınızı varsayarsak)
veya

11

Diğer bir seçenek, $hiddenmodel üzerindeki özelliği, görüntülemek istemediğiniz sütunları gizlemek için kullanmaktır. Bu özelliği anında tanımlayabilir veya modelinizde varsayılanları ayarlayabilirsiniz.

public static $hidden = array('password');

Artık JSON yanıtını döndürdüğünüzde kullanıcı parolası gizlenecek.

Aynı şekilde anında da ayarlayabilirsiniz.

User::$hidden = array('password');

2
Laravel 4.2'de bunu dinamik olarak ayarlamaya çalışırken 'User :: $ hidden korumalı özelliğe erişilemiyor' mesajı alıyorum.
mtmacdonald

1
olmamalı static.
StackOverflow

@StackOverflowed, sanırım bu sorunun / cevabın kaç yaşında olduğunu ve Laravel 3 ile ilgili olduğunu fark etmemişsin.
Jason Lewis

10

Sayfalandırma ile kullanma

$data = DB::table('themes')
->join('users', 'users.id', '=', 'themes.user_id')
->select('themes.*', 'users.username')
->paginate(6);

6

user2317976, ilişkili tabloların sütunlarını seçmenin harika bir statik yolunu tanıttı.

İşte bulduğum dinamik bir numara, böylece modeli kullanırken istediğinizi elde edebilirsiniz:

return Response::eloquent(Theme::with(array('user' => function ($q) {
    $q->addSelect(array('id','username'))
}))->get();

Bu numaranın load () ile de iyi çalıştığını buldum. Bu çok uygundur.

$queriedTheme->load(array('user'=>function($q){$q->addSelect(..)});

Hedef tablonun anahtarını da eklediğinizden emin olun, aksi halde bulamaz.


6

Bu yoldan:

Post::with(array('user'=>function($query){
    $query->select('id','username');
}))->get();

Lütfen daima cevabınızı açıklayın.
Rohit Gupta 04

Benzer bir sorun vardı, bu şimdiye kadarki en akıllıca yol! Bu cevap küçümseniyor!
eldblz

Bu, daha önce Seccad Eşref tarafından sunulan cevapla aynı.
2017

5

Bunun eski bir soru olduğunu biliyorum, ancak sorunun yazarının yaptığı gibi bir API oluşturuyorsanız, bu tür görevleri gerçekleştirmek için çıktı dönüştürücüleri kullanın.

Transofrmer, gerçek veritabanı sorgu sonucunuz ile bir denetleyici arasındaki bir katmandır. Bir kullanıcıya veya bir API tüketicisine verilecek olanı kolayca kontrol etmeye ve değiştirmeye izin verir.

Fractal'ı çıktı dönüştürme katmanınızın sağlam bir temeli olarak öneriyorum . Belgeleri buradan okuyabilirsiniz .



4

Laravel 5.5'te bunu yapmanın en temiz yolu:

Theme::with('user:userid,name,address')->get()

İki nokta üst üste ve seçmek istediğiniz alanları virgülle ayrılmış ve aralarında boşluk bırakmadan eklersiniz.


Sayfalandırmayı kullanırken ilgili tablonun belirli sütununu nasıl getirebileceğimizi biliyor musunuz?
Daniyal Nasir

2

Modeli Kullanma:

Model::where('column','value')->get(['column1','column2','column3',...]);

Sorgu Oluşturucuyu Kullanma:

DB::table('table_name')->where('column','value')->get(['column1','column2','column3',...]);

0

Bunu iyi anladıysam, yalnızca bir sütun görmek istemeniz dışında, döndürülen şey iyidir. Eğer öyleyse, aşağıdaki çok daha basit olmalı:

return Response::eloquent(Theme::with('user')->get(['username']));

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.