Laravel where() w konstruktorze

0

Witajcie.
Projekt w Laravelu 5.2.
Mam taką klasę (model) z jedną metodą:

class Gallery extends Model
{
    public function getGalleryFromDB($url = '')
    {
      return parent::where('url', '=', $url);
    }
}

Tworzę obiekt galerii i wywołuję metodę:

$gallery = new Gallery();
$gallery->getGalleryFromDB('jakisUrl');

I to działa, tzn. pobiera z bazy z tabeli galleries rekord z wszystkimi polami o dopasowanym url.
Chciałbym teraz przenieść to zapytanie do bazy, do konstruktora, czyli:

class Gallery extends Model
{
    public function __construct($url = '')
    {
      $gallery =  parent::where('url', '=', $url);
    }
}

I to już nie działa. Jakieś pomysły dlaczego?

0

Dlaczego chciałbyś przenieść to zapytanie do konstruktora?

0

Nie działa tzn. wywala błąd, czy co się dzieje?
Użyj funkcji dd(), żeby sprawdzić co zwraca ten where. Może zapomniałeś przekazać parametr przy tworzeniu obiektu Gallery?

0
Patryk27 napisał(a):

Dlaczego chciałbyś przenieść to zapytanie do konstruktora?

Ponieważ wydaje mi się to bardziej sensowne. Przy tworzeniu obiektu, chciałem od razu wypełnić jego pola (nazwę, katalog galerii, czy coś tam jeszcze).

0

Powoli, powoli - teraz to już jestem przekonany, że mamy do czynienia z problemem X/Y ;-)

Co próbujesz osiągnąć, tak ogólnie?

0

@Patryk27: wydaje mi się, że nic innego, jak:

$gallery = Gallery::whereUrl('jakisUrl)->first();
0
piotrevic napisał(a):

Nie działa tzn. wywala błąd, czy co się dzieje?
Użyj funkcji dd(), żeby sprawdzić co zwraca ten where. Może zapomniałeś przekazać parametr przy tworzeniu obiektu Gallery?

Parametr przy tworzeniu obiektu *Gallery" przekazałem.
Użyłem też dd(), przy prawidłowym odczycie z bazy dd() pokazuje:

Gallery {#156 ▼
  -name: ""
  -direcdirectory: ""
  -password: ""
  #connection: null
  #table: null
  #primaryKey: "id"
  #keyType: "int"
  #perPage: 15
  +incrementing: true
  +timestamps: true
  #attributes: array:8 [▶]
  #original: array:8 [▼
    "id" => 2
    "url" => "fotki"
    "name" => "Przykładowa galeria"
    "symbol_offer" => "S002"
    "directory" => "fotki"
    "password" => "$2y$10$iZLom5gM99.UmRMxGOZc5uDYn.V8h/FO2sTN5IqGABPuwVO367RI."
    "created_at" => "2018-09-21 09:44:54"
    "updated_at" => "2018-09-21 09:44:54"
  ]
  #relations: []
  #hidden: []
  #visible: []
  #appends: []
  #fillable: []
  #guarded: array:1 [▶]
  #dates: []
  #dateFormat: null
  #casts: []
  #touches: []
  #observables: []
  #with: []
  #morphClass: null
  +exists: true
  +wasRecentlyCreated: false
}

czyli tak jak chciałem, odczytuje rekord z wszystkimi polami.
Natomiast z konstruktora dd() pokazuje:

Builder {#163 ▼
  #query: Builder {#162 ▶}
  #model: Gallery {#157 ▼
    -name: ""
    -direcdirectory: ""
    -password: ""
    #connection: null
    #table: null
    #primaryKey: "id"
    #keyType: "int"
    #perPage: 15
    +incrementing: true
    +timestamps: true
    #attributes: []
    #original: []
    #relations: []
    #hidden: []
    #visible: []
    #appends: []
    #fillable: []
    #guarded: array:1 [▶]
    #dates: []
    #dateFormat: null
    #casts: []
    #touches: []
    #observables: []
    #with: []
    #morphClass: null
    +exists: false
    +wasRecentlyCreated: false
  }
  #eagerLoad: []
  #macros: []
  #onDelete: null
  #passthru: array:11 [▶]
  #scopes: []
  #removedScopes: []
}
0

przypisz to do zmiennej i zwróć do widoku i tyle, nie wiem po co tutaj konstruktor

0
Patryk27 napisał(a):

Powoli, powoli - teraz to już jestem przekonany, że mamy do czynienia z problemem X/Y ;-)

Co próbujesz osiągnąć, tak ogólnie?

"mamy do czynienia z problemem X/Y" - bardzo możliwe :-)

Próbuję na podstawie adresu url, odszukać w bazie rekord. Następnie utworzyć obiekt Galerii i ustawić (wypełnić) jego pola danymi z bazy, czyli:

class Gallery extends Model
{
    /**
     * Nazwa galerii pobrana z bazy danych
     * @var string
     */
    private $name = '';

    /**
     * nazwa katalogu ze zdjęciami
     * @var string
     */
    private $direcdirectory = '';

    /**
     * Hasło do strony z galerią
     * @var string
     */
    private $password = '';



    /**
     * Konstruktor szuka w bazie galerii na podstawie podanego adresu url
     * i ustawia pola w klasie
     * @param string $url
     */
    public function __construct($url = '')
    {
      // Szukam w bazie galerii o padanym adresie, jeśli nie ma, zwracam błąd 404

      $gallery = parent::where('url', '=', $url)->first();

      $this->nameame = $gallery->name;
      $this->password = $gallery->password;
    }
}

I teraz:

$gallery = new Gallery('fotki');

daje "HTTP ERROR 500"

0

I dlaczego akurat tak bardzo chcesz to mieć w konstruktorze? ;-)

Co w sytuacji, gdybyś chciał utworzyć obiekt galerii, który nie pobiera czegoś z bazy?
Z takim konstruktorem jesteś uziemiony.

0
czysteskarpety napisał(a):

przypisz to do zmiennej i zwróć do widoku i tyle, nie wiem po co tutaj konstruktor

Pewnie tak zrobię, nie daje mi tylko spokoju dlaczego zapytanie do bazy w metodzie klasy działa a w konstruktorze już nie.

0

Dodatkowo zwróć uwagę na to:

  • W konstruktorze wołasz parent::where(...)->get(), prawda?
  • Wynikiem ->get() będzie instancja modelu Gallery.
  • Aby utworzyć instancję modelu Gallery Laravel, pod spodem, odpala new Gallery().
  • new Gallery() powoduje odpalenie konstruktora, gdzie znowu (rekurencyjnie) wołasz parent::where(...)->get().
  • ... które znowu zmusza Laravela do utworzenia instancji modelu Gallery.
  • ... które znowu wywołuje parent::where(...)->get().
  • ... które znowu zmusza Laravela do utworzenia instancji.
  • ... które znowu wywołuje...

Voila - masz nieskończoną rekurencję ;-)

Innymi słowy: nie wrzucaj tego w konstruktor, bo śęńeda.

Wracając do sedna problemu: nadal nie rozumiem, co próbujesz osiągnąć.

Przecież Gallery::where(...)->get() już w takiej formie zwróci Ci model z wypełnionymi tymi danymi - po co Ci tamte dodatkowe $this->... = ...; w konstruktorze? One nic nie zmienią, bo te dane już są w zwracanym modelu.

0

Dzięki Patryk27, przekonałeś mnie :)

0

Tak jeszcze w ramach uzupełnienia, to co robi Laravel nazywa się Active Record. Możesz sobie doczytać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1