Mam dwa stoły User
i Post
. Jeden User
może mieć wiele posts
i jeden post
należący do tylko jednego user
.
W moim User
modelu mam hasMany
relację ...
public function post(){
return $this->hasmany('post');
}
A w moim post
modelu mam belongsTo
relację ...
public function user(){
return $this->belongsTo('user');
}
Teraz chcę połączyć te dwie tabele za pomocą, Eloquent with()
ale chcę konkretnych kolumn z drugiej tabeli. Wiem, że mogę korzystać z Konstruktora zapytań, ale nie chcę.
Kiedy w Post
modelu piszę ...
public function getAllPosts() {
return Post::with('user')->get();
}
Uruchamia następujące zapytania ...
select * from `posts`
select * from `users` where `users`.`id` in (<1>, <2>)
Ale chcę to ...
select * from `posts`
select id,username from `users` where `users`.`id` in (<1>, <2>)
Kiedy używam ...
Post::with('user')->get(array('columns'....));
Zwraca tylko kolumnę z pierwszej tabeli. Chcę konkretnych kolumn przy użyciu with()
z drugiej tabeli. Jak mogę to zrobić?
$query->select('id','username');
, otrzymywałemTrying to get property of non-object
id
w tym przypadku) jest niezbędny,$query->select()
aby faktycznie pobrać niezbędne wyniki. Pominąłem to w moim kodzie i nie mogłem zrozumieć, dlaczego nie znalazł żadnych wyników. Głupi ja! Mam nadzieję, że pomoże to każdemu, kto ma ten sam problemMożesz to zrobić w ten sposób, ponieważ Laravel 5.5:
Dbaj o
id
pole iforeign keys
jak stwierdzono w dokumentach :Na przykład, jeśli użytkownik należy do zespołu i ma
team_id
kolumnę jako klucz obcy, wówczas$post->user->team
jest pusty, jeśli nie określonoteam_id
źródło
get()
metodziePost::with('user:id,username')->get(['age', 'color']);
W twoim
Post
modeluPierwotny kredyt trafia do Laravel Eager Loading - Załaduj tylko określone kolumny
źródło
$fields
parametr.Kiedy idziesz w drugą stronę (hasMany):
Nie zapomnij dołączyć klucza obcego (zakładając, że w tym przykładzie jest to user_id), aby rozwiązać relację, w przeciwnym razie uzyskasz zerowe wyniki dla relacji.
źródło
W Laravel 5.7 możesz wywoływać określone pola w ten sposób
Ważne jest, aby dodać
foreign_key
pole w zaznaczeniu.źródło
W twoim
Post
modelu:Teraz możesz użyć
$post->userWithName
źródło
Jeśli chcesz uzyskać określone kolumny za pomocą
with()
elarquent laravela, możesz użyć kodu jak poniżej, na który pierwotnie odpowiedział @Adam w swojej odpowiedzi tutaj w odpowiedzi na to samo pytanie:Użyłem tego w moim kodzie, ale dawało mi to błąd
1052: Column 'id' in field list is ambiguous
, więc jeśli macie również ten sam problemNastępnie, aby go rozwiązać, musisz podać nazwę tabeli przed kolumną id w
with()
metodzie, jak poniżej :źródło
Natknąłem się na ten problem, ale z drugą warstwą powiązanych obiektów. Odpowiedź @Awais Qarni utrzymuje się wraz z włączeniem odpowiedniego klucza obcego do zagnieżdżonej instrukcji select. Tak jak identyfikator jest wymagany w pierwszej zagnieżdżonej instrukcji select, aby odwoływać się do powiązanego modelu, tak klucz obcy jest wymagany do odniesienia do drugiego stopnia powiązanych modeli; w tym przykładzie model firmy.
Ponadto, jeśli chcesz wybrać określone kolumny z modelu Post, musisz dołączyć kolumnę user_id do instrukcji select, aby móc się do niej odwoływać.
źródło
Zauważ, że jeśli potrzebujesz tylko jednej kolumny z tabeli, użycie „list” jest całkiem przyjemne. W moim przypadku pobieram ulubione artykuły użytkownika, ale chcę tylko identyfikatora artykułu:
Zwraca tablicę identyfikatorów, np .:
źródło
toArray()
!!!$user->favourites->lists('id')->toArray();
$user->favourites
powróciCollection
z wybranymi wszystkimi polami. Prawidłowe stosowanie jest:$user->favourites()->lists('id')
.Query\Builder::lists
metodą aCollection::lists
metodą.Możesz także określić kolumny w pokrewnym modelu w momencie dostępu do niego.
Post::first()->user()->get(['columns....']);
źródło
Teraz możesz użyć
pluck
metody naCollection
instancji:Zwróci tylko
uuid
atrybutPost model
źródło
Spróbuj z warunkami.
źródło
źródło