Laravel 4 有说服力的关系-更新和/或保存

Laravel 4 有说服力的关系-更新和/或保存,laravel-4,eloquent,polymorphic-associations,Laravel 4,Eloquent,Polymorphic Associations,我在这里看到过类似的问题,但没有找到合适的答案,因此再次提问。如果你知道任何线索请带我去 我有 模型用户和模型属性,两者都有地址 class Address { protected $fillable = ['address','city','state','zip']; public function addressable(){ return $this->morphTo(); } }//Address class User extends El

我在这里看到过类似的问题,但没有找到合适的答案,因此再次提问。如果你知道任何线索请带我去

我有

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

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类型方法

Taylor Otwell的官方回答

$account = Account::find(99);
User::find(1)->account()->associate($account)->save();
不工作,因为我遇到了一个异常

消息:调用未定义的方法\Database\Query\Builder::associate 类型: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
我可以使用不同的路径放置到/update{id}并发布到/ 但在我的案例中,新记录和现有记录都是通过同一路线/更新的

你们能推荐更好的方法吗


Thx,

非常简单:

//仅获取适用的字段 $input=input::仅“地址”、“城市”、“州”、“邮政编码”; //获取现有地址或实例化新地址 $address=地址::firstOrNew$input; //将地址与用户关联 //顺便说一句,如果是morhpmany的话,我宁愿称之为关系地址 用户::查找$userId->地址->保存$address;
我不知道你从哪里得到泰勒的答案,但我不认为这是本案的答案。反正也不行。

首先,谢谢你的回答。我有一个问题,在firstOrNew中,如果我们没有专门为现有地址传递地址id,它将如何发现?在这种情况下,地址的id位于post字段中。有什么想法吗?THX这是ommit id的方法。Eloquent将通过地址、城市、州、邮编组合查找现有地址地址地址或多或少是一个值对象,id最终根本不重要,或者实例化新模型并填充上述组合作为其属性。先试试这个,再来一次。如果用户编辑地址会发生什么?似乎它将插入一个新的行,这肯定不是一个理想的结果。想法?嗯,就像我说的,地址是非常有价值的对象,所以在我看来不应该改变。无论如何,若要编辑,只需传递id并更新获取的行即可。当你创造新的东西时,只需要创造一个单一的责任。明白了,非常感谢你的建议。我真的很感激。非常感谢。