Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Frameworki _ [LR] Relacja z whereHas

Napisany przez: markonix 25.03.2018, 20:37:15

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');

Napisany przez: r4xz 26.03.2018, 06:50:25

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. }

Napisany przez: markonix 28.03.2018, 01:03:10

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).

Napisany przez: Pyton_000 28.03.2018, 08:07:37

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`

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)