1. 新增有三种方式,我们一一来看,比如给一个用户增加关联书籍;
//先限定用户
$user = User ::find(19);
//给这个用户关联的book 新增一条记录
//user_id 会自动写入 19,title 自定义
$user->book()->save(new Book([ 'title ' => '《哈利波特》 ']));
2. 需要设置批量赋值,我们取消掉,book 表没有时间字段,也要取消自动写入;
//取消批量赋值
protected $guarded = [];
//取消自动时间字段
public $timestamps = false;
//批量新增
$user->book()->saveMany([
new Book([ 'title ' => '《哈利波特》 ']),
new Book([ 'title ' => '《指环王》 '])
]);
3. create 和 createMany 只需要插入数组即可完成关联新增;
$user->book()->create([
'title ' => '《哈利波特》 '
]);
$user->book()->createMany([
[ 'title ' => '《哈利波特》 '],
[ 'title ' => '《指环王》 ']
]);
PS:还有 findOrNew、firstOrNew、firstOrCreate 和 updateOrCreate 方法;
4. 有新增, 自然有修改删除,直接使用 delete()和 update()方法即可;
//关联删除,删除 user_id=19 的书
$user = User ::find(99);
$user->book()->delete();
//关联修改,修改 user_id=19 的书
$user = User ::find(99);
$user->book()->update([ 'title ' => '《修改书籍》 ']);
5. 使用 associate()方法来修改掉书籍关联的用户,即修改 user_id;
//修改关联的外键,即 :user_id 修改,换用户
$user = User ::find(20);
$book = Book ::find(11);
$book->user()->associate($user);
$book->save();
PS:如果想取消一本书的拥有者,比如将 user_id 设置为 null,字段要设置可以 null; $book = Book ::find(11);
$book->user()->dissociate();
$book->save();
6. 在搜索书籍的对应用户的时候,空 null 字段会导致用户出现 null 数据;
7. 我们可以采用空对象默认模型的方式,去解决这个问题;
//Book.php
public function user()
{
return $this->belongsTo(User ::class, 'user_id ', 'id ')
->withDefault([
'id ' => 0,
'username ' => '游客用户 '
]);
}