Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Laravel] Eloquent poprawne zwrócenie danych
john_doe
post
Post #1





Grupa: Zarejestrowani
Postów: 873
Pomógł: 25
Dołączył: 24.07.2005

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


mam takie dwie encje

  1. public function up()
  2. {
  3. Schema::create('configurations', function (Blueprint $table) {
  4. $table->increments('id');
  5. $table->date('date_from');
  6. $table->integer('race_id');
  7. $table->timestamps();
  8. });
  9. }

w modelu mam
  1. public function parameters()
  2. {
  3. return $this->hasMany('App\Models\Parameter');
  4. }

oraz listę parametrów przypisanych do danej konfiguracji
  1. public function up()
  2. {
  3. Schema::create('parameters', function (Blueprint $table) {
  4. $table->increments('id');
  5. $table->integer('configuration_id');
  6. $table->tinyInteger('day');
  7. $table->decimal('water', 8, 3);
  8. $table->smallInteger('feed');
  9. $table->smallInteger('weight');
  10. $table->decimal('downs');
  11. $table->timestamps();


pytania z założeniami:

1. Potrzebuję wyciągnąć zsumowaną pod względem ( water, feed, weight, downs ) listę parametrów należące do configuracji o race_id in (tutaj różnie może być od jednego id po kilka) + dodatkowo jak widać mogę mieć kilka konfiguracji dla danego race_id więc potrzebują wziąć tą z najnowszą datą.

  1. $configuration = Configuration::whereIn('race_id', [1, 2])->get();


może też inaczej ,..... chciałbym osiągnąć wynik, który daje np takie zapytanie:

  1. SELECT p.[DAY], SUM(p.water), SUM(p.feed), SUM(p.weight), SUM(p.downs)
  2. FROM dbo.parameters p LEFT JOIN dbo.configurations c ON c.id = p.configuration_id
  3. INNER JOIN (
  4. SELECT race_id, MAX(date_from) AS MaxDate
  5. FROM dbo.configurations
  6. GROUP BY race_id
  7. ) tm ON c.race_id = tm.race_id AND c.date_from = tm.MaxDate
  8. WHERE c.race_id IN (1,2)
  9. GROUP BY p.[DAY]
  10. ORDER BY 4;


czyli potrzebuję wybrać najnowszą konfigurację dla danego race_id. W przypadku kilku race_id wziąć najnowszą konfigurację i dodać ja do najnowszego konfiguracji z kolejnego race_id

Chciałbym to wyciągnąc ładnie ORM i nie uzywać plain query.
Czy ktoś z Was ma pomysł?

Ten post edytował john_doe 10.05.2018, 14:37:05
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
GrupaZero
post
Post #2





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 30.05.2018

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


Hej,

Jest to bardzo często spotykany problem, gdy chcesz posortować lub też filtrować wyniki na bazie relacji.
Najlepszym rozwiązaniem w takim przypadku jest dynamiczne zbudowanie odpowiedniego zapytania ze wszystkimi JOIN'ami jakie są potrzebne. Każda tabele powinna posiadać jakiś alias, a następnie na bazie pól, które dostaniesz do sortowania/filtrowania wprowadzasz odpowiednie warunki. Cała magia polega na tym, że na końcu nie wyciągasz wszystkich pól, a jedynie tą główną tabelę Eloquent i dopiero potem doczytujesz pozostałe relacje (->with() lub ->load()).

Tutaj masz przykładową implementację z tym, że jest to już trochę bardziej zaawansowane, ponieważ używam własnego QueryBuilder'a do rozkminienia jakie relację muszę załadować, ale mniej więcej widać koncepcję
https://github.com/GrupaZero/cms/blob/maste...y.php#L296-L330

Tutaj może to być nawet lepiej widoczne, wystarczy do tego zapytania dodać odpowiedni orderBy
https://github.com/GrupaZero/cms/blob/maste...y.php#L105-L116
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 29.12.2025 - 21:30