I am having a issue with an Eloquent morphOne
relationship where it is creating new entries rather than updating the one that already exists.
Basically I have a number of models (for example, let's say Person
and Building
) that both need a location, so I have created a Location
model:
class Location extends Eloquent {
public function locationable()
{
return $this->morphTo();
}
}
Then in my other models I have this:
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');
}
// ...
When I run the following test code, it creates the location entry fine, but if I repeat it, it creates more entries.
$person = Person::first();
$loc = new Location;
$loc->lat = "123";
$loc->lng = "321";
$person->location()->save($loc);
Am I doing something wrong here? I would have expected morphOne
to constrain this to one entry per type, so the last entry in the table below should not exist:
+---------------------+--------------------------+
| locationable_id | locationable_type |
+---------------------+--------------------------+
| 2 | Building |
| 3 | Building |
| 2 | Person |
| 2 | Building |
+---------------------+--------------------------+
Based on my very current experiences, this solution should be works
Creation or replace old by new Location model instance:
Update:
I spent many days for finding out this solution. Hope they would document it much better officially.
Actually, by calling
you are, by definition, creating a new location!
Calling
doesn't help either.
IF you want to update a location, you need to find the location, update it's values and then save it. Independently from the parent model:
Done.
Maybe I'm late for the party, but this worked for me!