Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [LR] Relacja z whereHas
markonix
post 25.03.2018, 20:37:15
Post #1





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Powiedzmy, że mamy model artykuły i w nim:
  1. public function comments()
  2. {
  3. return $this->hasMany('App\Models\Comment');
  4. }


A komentarz ma relację do autora. I teraz chciałbym przy każdym wywołaniu $article->comments wyświetlić komentarze tylko z autorem, który nie jest usunięty.
Klucze obce rozwiązują fajnie sprawę ale mamy tu problematyczny softdeleting tak więc wyświetlają się komentarze także od ludzi, których w teorii już nie ma.

Czy da się to osiągnąć na samym poziomie deklarowania relacji. Oczywiście znam metody whereHas lub filtrowanie kolekcji ale to już muszę robić świadomie i za każdym razem, a $article->comments jest w wielu miejscach w różnych kontekstach (np. $article->comments->count()).

edit: To było prostsze niż myślałem. Nie sądziłem, że whereHas można wywołać na obiekcie Relacji ale można więc wystarczy:
return $this->hasMany('App\Models\Comment')->whereHas('author');


Ten post edytował markonix 25.03.2018, 21:05:11


--------------------
Go to the top of the page
+Quote Post
r4xz
post 26.03.2018, 06:50:25
Post #2





Grupa: Zarejestrowani
Postów: 673
Pomógł: 106
Dołączył: 31.12.2008

Ostrzeżenie: (0%)
-----


Przy okazji zamiast pisać:

  1. public function comments()
  2. {
  3. return $this->hasMany('App\Models\Comment');
  4. }


To polecam robić to tak (łatwiejszy refactoring):

  1. public function comments()
  2. {
  3. return $this->hasMany(\App\Models\Comment::class);
  4. }


--------------------
Go to the top of the page
+Quote Post
markonix
post 28.03.2018, 01:03:10
Post #3





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Rozumiem w pewnym stopniu zasadność takiej struktury, ale jakoś przejrzystszy (może krótszy po prostu) mi się wydaje string, w dokumentacji Laravel też taki format jest na przykładach.
Dużo nie tracę bo STORM także pozwala na nawigacje po takiej klasie wprowadzonej jako string (jedynie nie podpowiada przy wpisywaniu).

Ten post edytował markonix 28.03.2018, 01:03:56


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post 28.03.2018, 08:07:37
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Uzywając notacji obiektowej możesz zaimportować namespace i zostanie Ci wtedy samo `Comment::class` co jest którtsze wg. Twojego argumentu wink.gif

Kolejny ciekawy argument to jest taki że jeśli kiedyś ci się przytrafi autmoatyczna refaktoryzacja to bez problemu wyłapie takie miejsca i sobie edytor z tym poradzi, string nie koniecznie.
Ale to wszystko raczej kosmetyczne zmiany.

Ot po prostu przyjęło się używać notacji `::class`
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 22:30