2014-07-11 9 views
5

Mam problem z wymownym morphOne relacji, gdzie jest tworzenie nowych wpisów zamiast aktualizującego ten, który już istnieje.związek Eloquent morphOne nie ogranicza się do jednego stosunku

Zasadniczo mam kilka modeli (na przykład, powiedzmy Person i Building), że zarówno potrzeba lokalizację, więc stworzyliśmy Location model:

class Location extends Eloquent { 

    public function locationable() 
    { 
     return $this->morphTo(); 
    } 

} 

Następnie w moich innych modeli mam to :

class Person extends Eloquent { 

    // ... 

    /** 
    * Get the person's location 
    * 
    * @return Location 
    */ 
    public function location() 
    { 
     return $this->morphOne('Location', 'locationable'); 
    } 

    // ... 
class Building extends Eloquent { 

    // ... 

    /** 
    * Get the building's location 
    * 
    * @return Location 
    */ 
    public function location() 
    { 
     return $this->morphOne('Location', 'locationable'); 
    } 

    // ... 

Kiedy uruchomić następujący kod testowy, to cre wpis położenia jest w porządku, ale jeśli go powtórzę, tworzy więcej wpisów.

$person = Person::first(); 

$loc = new Location; 

$loc->lat = "123"; 
$loc->lng = "321"; 

$person->location()->save($loc); 

Czy robię coś nie tak? Liczyłam morphOne ograniczyć to do jednej pozycji na typ, więc ostatni wpis w poniższej tabeli nie powinny istnieć:

+---------------------+--------------------------+ 
| locationable_id | locationable_type  | 
+---------------------+--------------------------+ 
| 2     | Building    | 
| 3     | Building    | 
| 2     | Person     | 
| 2     | Building    | 
+---------------------+--------------------------+ 
+1

Nie, nie robisz to źle. Tak po prostu działa. Stosunki polimorficzne są dobre dla łatwego rzeczy, ale im dalej, tym więcej błędów można znaleźć. –

+0

Więc sugerujesz ich unikać w miarę możliwości? Nie ma dla mnie sensu robienie niczego innego, ale tworzenie relacji polimorficznej. 1) Ktoś sugeruje robi proste, jeśli jeszcze sprawdzić, czy 'orderable_type' jest pusty następnie tworzyć, aktualizować inaczej, jaka jest wasza opinia na ten temat? 2) https://i.imgur.com/gPmh1OK.png Opinia na ten temat? Chciałbym to usłyszeć. Dziękuje. – Pavan

Odpowiedz

2

Faktycznie, wywołując

$loc = new Location; 

jesteś, z definicji, tworzenie nowej lokalizacji!

Wywołanie

$person->location()->save($loc); 

nie pomaga.

JEŻELI chcesz zaktualizować lokalizację, musisz znaleźć lokalizację, zaktualizować jej wartości, a następnie zapisać. Niezależnie od modelu macierzystego:

$person = Person::first(); 

$loc = $person->location; 

$loc->lat = "123"; 
$loc->lng = "321"; 

$loc->save(); 

Zrobione.

1

Może jestem późno na imprezę, ale ten pracował dla mnie!

# Do we have location already? 
if($person->location) { 
    return $person->location()->update($location); 
} 
return $person->location()->create($location); 
1

podstawie moich bardzo aktualnych doświadczeń, to rozwiązanie powinno być prace

stworzenie lub zastąpić stary za nowy instancji modelu Lokalizacja:

$person = Person::first(); 

$loc = new Location; 

$loc->lat = "123"; 
$loc->lng = "321"; 

$loc->save(); 
$person->location()->associate($loc); 
$person->save(); 

Aktualizacja:

$person = Person::first(); 

$person->location->lat = "123"; 
$person->location->lng = "321"; 

$person->location->save(); 
$person->save(); 

I spędził wiele dni na znalezienie tego rozwiązania. Mam nadzieję, że udokumentują to znacznie lepiej oficjalnie.

Powiązane problemy