Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Laravel Eloquent foreach i save
markonix
post
Post #1





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

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


  1. $i = 0;
  2. $trainings->each(function($training) use ($i) {
  3. dump($training->id);
  4. $training->topic = ++$i;
  5. $training->save();
  6. });


Czy użyje foreach czy each to nie zadziała. W $trainings mam ładną kolekcję obiektów Training zwróconą za pomocą ->get().
Samo $training->topic działa, nadpisze atrybuty ale gdy użyje to wraz save() to wszystko się psuje - dump zwraca za każdym razem id pierwszego obiektu.

Nie umiem zrozumieć dlaczego to nie działa? Jakieś rozwiązania na szybko bym znalazł (skorzystać z QB czy tworzyć w każdym obrocie pętli $obj = new Training::find($training->id) ale to by było mega słabe (na każdy obrót pętli 2 zapytania).

Generalnie najbardziej optymalnie by było coś w stylu:
  1. $i = 0;
  2. $trainings->each(function($training) use ($i) {
  3. dump($training->id);
  4. $training->topic = ++$i;
  5. });
  6.  
  7. $trainings->save();

Ale to już bardziej rozumiem, że nie przechodzi (ale nie ukrywam, było by miło jakby był też sposób aby w ten sposób masowo updatejtnąć wszystkie obiekty).
Go to the top of the page
+Quote Post
Pyton_000
post
Post #2





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

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


A:
  1. $i = 0;
  2. $trainings->each(function($training) use ($i) {
  3. $training->update([
  4. 'topic' => ++$i
  5. ]);
  6. });
Go to the top of the page
+Quote Post
markonix
post
Post #3





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

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


Gdy się położyłem to mi się dopiero żarówka zaświeciła.
Generalnie ta cała akcja służy reindeksacji pewnej kolumny przy delete/update/insert. Dla delete i insert nie ma problemu jednak problem przychodzi przy update.
  1. static::updated(function($training) {
  2. static::reindex($training->date);
  3. });

Używając eloquent spowoduje zapętlenie - update użytkownika odpala metodę reindex(), która odpala event. Podpowiedzią był error 500 zwracany przez ajax.
Pytanie jak do tego teraz fajnie podejść. Użycie Query buildera generalnie rozwiązuje problem, jako, że on nie odpala eventów.
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Zacznij prosze zakladac tematy we wlasciwym dziale. Przenosze
Go to the top of the page
+Quote Post
markonix
post
Post #5





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

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


Problem i tak się okazał "ponad frameworkowy". Zapętlenie się eventów na update to raczej problem logiczny (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Nie mniej jednak mocno dotyczylo to jak dziala Laravel i eloquent (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
Pyton_000
post
Post #7





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

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


Możesz wywalić eventy dając `Training::flushEventListeners();`
Go to the top of the page
+Quote Post
markonix
post
Post #8





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

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


Ostatecznie podszedłem do tego bardziej skomplikowanie.
Wyłuskałem z dokumentacji ciekawe metody isDirty() i getOriginal() i wykonuje tylko reIndex w momencie gdy zmieniła się godzina.
Przy okazji jest to też rozwiązanie na problem na który bym wcześniej nie zwrócił uwagi - reindeks działał każdorazowo tylko na NOWĄ datę, a przy zmianie daty jest on potrzebny także dla oryginalnego dnia.
Tak więc ostateczny kod:

  1. static::updated(function($training) {
  2. if ($training->isDirty('hour')) {
  3. static::reindexTrainings($training->date);
  4. }
  5. if ($training->isDirty('date')) {
  6. static::reindexTrainings($training->getOriginal('date'));
  7. }
  8. });


Ten post edytował markonix 5.04.2017, 11:05:06
Go to the top of the page
+Quote Post

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: 25.08.2025 - 05:54