雄辩的morphOne关系不限于一种关系

Kee*_*eet 7 polymorphism laravel eloquent laravel-4

我遇到了Eloquent morphOne关系的问题,即创建新条目而不是更新已存在的条目.

基本上我有一些模型(例如,让我们说PersonBuilding)都需要一个位置,所以我创建了一个Location模型:

class Location extends Eloquent {

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

}
Run Code Online (Sandbox Code Playgroud)

然后在我的其他模型中我有这个:

class Person extends Eloquent {

    // ...

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

    // ...
Run Code Online (Sandbox Code Playgroud)
class Building extends Eloquent {

    // ...

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

    // ...
Run Code Online (Sandbox Code Playgroud)

当我运行以下测试代码时,它会创建位置条目,但如果我重复它,它会创建更多条目.

$person = Person::first();

$loc = new Location;

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

$person->location()->save($loc);
Run Code Online (Sandbox Code Playgroud)

我在这里做错了吗?我原本希望morphOne将此约束为每种类型一个条目,因此下表中的最后一个条目不应存在:

+---------------------+--------------------------+
|  locationable_id    |   locationable_type      |
+---------------------+--------------------------+
|  2                  |  Building                |
|  3                  |  Building                |
|  2                  |  Person                  |
|  2                  |  Building                |
+---------------------+--------------------------+
Run Code Online (Sandbox Code Playgroud)

Mur*_*rwa 5

也许我参加聚会迟到了,但这对我有用!

# Do we have location already?
if($person->location) {
    return $person->location()->update($location);
}
return $person->location()->create($location);
Run Code Online (Sandbox Code Playgroud)


小智 3

实际上,通过调用

$loc = new Location;
Run Code Online (Sandbox Code Playgroud)

根据定义,您正在创建一个新位置!

呼唤

$person->location()->save($loc);
Run Code Online (Sandbox Code Playgroud)

也没有帮助。

如果您想更新某个位置,您需要找到该位置,更新其值,然后保存。独立于父模型:

$person = Person::first();

$loc = $person->location;

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

$loc->save();
Run Code Online (Sandbox Code Playgroud)

完毕。