雄辩的morphmany关系 - 更新和/或保存

时间:2014-11-23 14:05:29

标签: laravel-4 eloquent polymorphic-associations

我在这里看到类似的问题,但没有找到任何合适的答案,因此再次询问。如果您知道任何主题,请指导我,

我有

模型用户和模型属性,两者都有地址

class Address {
    protected $fillable = ['address','city','state','zip'];

  public function addressable(){
        return $this->morphTo();
    }
}//Address

class User extends Eloquent {

    protected $fillable = ['first_name','last_name', 'title'];

  public function address(){
        return $this->morphMany('Address', 'addressable');
    }
}//User

class Property extends Eloquent {

    protected $fillable = ['name','code'];

  public function address(){
        return $this->morphMany('Address', 'addressable');
    }
}//Property

是否有任何方法可以使用UpdateIfNotCreate类型方法来更新地址以及与用户/属性相关联?

泰勒奥特威尔的官方回答,

$account = Account::find(99);
User::find(1)->account()->associate($account)->save();

无效,因为我收到了异常

消息:"调用未定义的方法Illuminate \ Database \ Query \ Builder :: associate()"
type:" BadMethodCallException"

我解决问题的方法如下:

$data = Input::all();

if($data['id'] > 0){
    $address_id = $data['id']; unset($data['id']);
    $address = Address::find($address_id)->update($data);
}//existing
else{
    $address = new Address($data);
    User::find($user_id)->address()->save($address);
}//add new

我可以使用不同的路由(PUT到/更新{id}和POST到/) 但在我的情况下,新记录和现有记录都来到同一路径(/ update)

你们可以推荐更好的方法来解决这个问题吗?

THX,

1 个答案:

答案 0 :(得分:0)

这很简单:

// get only applicable fields
$input = Input::only('address','city','state','zip');

// get existing or instantiate new address
$address = Address::firstOrNew($input);

// associate the address with the user
// btw I would rather call this relation addresses if it's morhpmany
User::find($userId)->addresses()->save($address);

不确定泰勒的答案在哪里,但我不认为这是应该的。无论如何它都无法发挥作用。