Laravel Eloquent: 更新模型及其关联

13
使用一个简洁的模型,你可以通过调用一个函数来简单地更新数据。
$model->update( $data );

但不幸的是,这并不会 更新关联关系。

如果您也想更新关联关系,则需要手动分配每个值并调用 push()

$model->name = $data['name'];
$model->relationship->description = $data['relationship']['description'];
$model->push();

虽然这个方法可以工作,但如果您需要分配大量数据,它会变得混乱。

我正在寻找类似于

$model->push( $data ); // this should assign the data to the model like update() does but also for the relations of $model

有人可以帮我吗?


1
没有这个方法,但你尝试过像这样吗:$model->relationship->fill($data['relationship']); 然后 push - Jarek Tkaczyk
这是我目前的做法,但我想知道是否有更优雅的方法来实现 :) - user3518571
1
没有其他方法,因为Eloquent目前不知道模型上有哪些关系,除非您将它们作为动态属性调用、使用load方法加载、预加载等(push仅适用于已加载到模型的relations数组中的关系)。 - Jarek Tkaczyk
2个回答

16

您可以实现观察者模式来捕获“更新” Eloquent 事件。

首先,创建一个观察者类:

class RelationshipUpdateObserver {

    public function updating($model) {
        $data = $model->getAttributes();

        $model->relationship->fill($data['relationship']);

        $model->push();
    }

}

然后将其分配给您的模型

class Client extends Eloquent {

    public static function boot() {

        parent::boot();

        parent::observe(new RelationshipUpdateObserver());
    }
}

当您调用更新方法时,“updating”事件将被触发,因此观察者将被激活。

$client->update(array(
  "relationship" => array("foo" => "bar"),
  "username" => "baz"
));

请查看Laravel文档以获取完整的事件列表。


非常感谢!这(在我看来)是这个问题的最佳解决方案。 - user3518571
1
getAttributes()方法不返回关系索引。 - Homer

6
你可以尝试类似这样的方式,例如创建一个客户模型和一个相关的地址模型:
// Get the parent/Client model
$client = Client::with('address')->find($id);

// Fill and save both parent/Client and it's related model Address
$client->fill(array(...))->address->fill(array(...))->push();

还有其他保存关系的方法。您可以查看此答案以获取更多详细信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接