laravel学习教程之关联模型(6)

Eloquent 提供了方便的方法来为模型添加一个关联。比如,也许你需要为 Post 模型新增一个 Comment。除了手动的设置 Comment 的 post_id 属性,你也可以直接在关联模型中调用 save 方法来插入 Comment:

$comment = new App\Comment(['message' => 'A new comment.']); $post = App\Post::find(1); $post->comments()->save($comment);

注意上面我们并没有使用关联模型的动态属性的方式来访问 comments,而是使用 comments 方法的形式来获取关联模型的实例。save 方法会自动的添加相应的 post_id 值到新的 Comment 模型上。

如果你需要一次添加多个关联模型,你需要使用 saveMany 方法:

$post = App\Post::find(1); $post->comments()->saveMany([ new App\Comment(['message' => 'A new comment.']), new App\Comment(['message' => 'Another comment.']), ]);

Save & 多对多关联

当与多对多关联互动时,save 方法接收一个中间层表属性的额外参数数组作为第二个参数:

App\User::find(1)->roles()->save($role, ['expires' => $expires]);

Create 方法

除了 save 和 saveMany 方法之外,你也可以使用 create 方法,它可以接收属性组成的数组,创建一个模型并且将其存储到数据库。这一次,save 和 create 方法的区别是 save 接收一个完整的 Eloquent 模型实例,而 create 接收的是一个原生的 PHP array:

$post = App\Post::find(1); $comment = $post->comments()->create([ 'message' => 'A new comment.', ]);

在使用 create 方法之前,你应该确保已经阅读了属性的 批量赋值文档。

更新从属关联模型

当更新一个 belongsTo 关联时,你应该使用 associate 方法。这个方法会在下层模型中设置外键:

$account = App\Account::find(10); $user->account()->associate($account); $user->save();

当删除 belongsTo 关联时,你应该使用 dissociate 方法,该方法会重置下层模型所关联的外键:

$user->account()->dissociate(); $user->save();

多对多关联

附加 / 抽离

当使用多对多关联时,Eloquent 提供了一些额外的帮助方法来更方便的管理关联模型。比如,让我们想象一下用户可以有很多角色并且角色可以有很多用户。你可以使用 attach 方法来附加一个角色到用户并且在中间表中加入这条记录:

$user = App\User::find(1); $user->roles()->attach($roleId);


当附加关联到模型时,你也可以传递一个含有额外数据的数组来将其添加到中间表中:

$user->roles()->attach($roleId, ['expires' => $expires]);

当然,有时候你可能需要从用户中删除一个角色。你可以使用 detach 方法来删除多对多关联的记录。datech 方法将从中间表中删除相应的记录。但是,除了中间表,其它两个模型的记录都还会被保留:

// Detach a single role from the user... $user->roles()->detach($roleId); // Detach all roles from the user... $user->roles()->detach();

为了更加的便捷,attach 和 detach 也可以接收 IDs 所组成的数组作为输入:

$user = App\User::find(1); $user->roles()->detach([1, 2, 3]); $user->roles()->attach([1 => ['expires' => $expires], 2, 3]);

更新中间表的记录

如果你需要更新中间表中存在的行,你可以使用 updateExistingPivot 方法:

$user = App\User::find(1); $user->roles()->updateExistingPivot($roleId, $attributes);

便利的同步

你也可以使用 sync 方法来构建多对多的关联。sync 方法接收放置中间表 IDs 所组成的数组。任意 IDs 如果没有在所给定的数组中,那么其将会从中间表中进行删除。所以,在操作完成之后,只有存在于给定数组里的 IDs 才会存在于中间表中:

$user->roles()->sync([1, 2, 3]);

你也可以同时传递额外的中间表的键值对:

$user->roles()->sync([1 => ['expires' => true], 2, 3]);

联动上层模型时间戳

当一个模型 belongsTo 或者 belongsToMany 另外一个模型时,比如 Comment 从属于 Post,这对下层模型更新时同时要求更新上层模型的时间戳时很有帮助。比如,当 Comment 模型更新了,你想要自动的更新其所属的 Post 模型的 updated_at 时间戳。Eloquent 使之变的非常容易。你只需要在下层模型中添加一个 touches 属性来包含关联的名称就可以了:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/5ca46c020df88a8c2b8e1156d1574bf3.html