【问题标题】:How to store many to many relationship in Laravel without pivot model?如何在没有枢轴模型的情况下在 Laravel 中存储多对多关系?
【发布时间】:2020-09-17 16:56:11
【问题描述】:

我正在尝试创建多对多关系,我有 2 个主表和 1 个数据透视表

user

id : 1
name : lily 

event

id: 1
event_name: Waterpark Waterday
-------
id: 2
event_name :Theme Park Adventure

event_user

id : 1
event_id : 2
user_id : 1
-------------
id :2
event_id :1
user_id :1

表用户和事件都已创建。数据透视表或关系仅在用户想要加入事件时创建。所以当用户点击应用按钮时,它只会存储event_iduser_id 我想创建这样的东西。但我有问题,我不太确定如何保存它。它确实尝试过,但我不断收到错误。

【问题讨论】:

  • 在控制器 $event = Event::find($request->event_id);
  • 你在register.blade.php上通过$event->id了吗?
  • 哦,我得到了一些东西,但BadMethodCallException Call to undefined method App\User::event()有错误
  • @lily 那么关系名称( event() )是错误的,请更新模型代码关系或完整的 xD 将更容易我们为您提供帮助
  • $user->event()->attach($event); -> 应该是 $user->events()->attach($event);

标签: php laravel


【解决方案1】:

您可以使用attachdetach 方法。

您也可以使用sync 方法来构建多对多关联。 sync 方法接受要放置在中间表上的 ID 数组。任何不在给定数组中的 ID 都将从中间表中删除。所以,这个操作完成后,中间表中只会存在给定数组中的ID:

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

在数组中1,2 是事件ID。

您可以在documentation阅读更多内容

注意

对于sync, attach,您应该在模型中定义关系。

用户模型

class User extends Model
{
    public function events()
    {
        return $this->belongsToMany('App\Event','event_user','user_id','event_id');
    }
}

事件模型

class Event extends Model
{
    public function users()
    {
        return $this->belongsToMany('App\User','event_user','event_id','user_id');
    }
}

根据您的代码。

$user = User::find(Auth::user()->id);
$user->events()->sync([$request->event_id]);

【讨论】:

  • 这段代码是否意味着我必须在代码中手动存储id? sync([1,2]);我不喜欢硬编码,因为这是一个以后会用到的系统
  • 请注意我已编辑。你需要在模型中建立关系。在你也可以使用同步和附加之后,
  • 先生,我有疑问是同步方法替换旧ID?因为我尝试添加多个具有相同用户 ID 的 event_id,我意识到旧的事件 ID 已被删除。并且只存储最新的。
  • 附加和分离适用于hasone或hasmany,多对多总是使用同步。使用它的许多优点。
  • 感谢您的解释。我决定使用这种方法,但使用 syncWithoutDetaching() 修改它,正如 Alzafan 在下面提到的那样。
【解决方案2】:

我的可选答案:

(因为当您拥有大数据时,附加比同步更快)

//get current synced id
$attachedIds = $user->events()->pluck('id');
//check if there is a new id selected
//if its a single id
$new_id = array_diff([$request->event_id], $attachedIds);
//if its already an array
$new_id = array_diff($request->input('event_id', []), $attachedIds);

$user->events()->attach($new_id);

【讨论】:

  • 我一定会尝试这两种方法来更好地理解和比较。谢谢你:)
  • @lily 忘了提到 laravel 有替代方法,比如我的答案 syncWithoutDetaching() 只需看看这里 laravel.com/docs/5.5/… 或使用 sync($array_id, false)
  • 哦,我才意识到这个同步方法会删除旧 ID?当同一个用户注册一个新事件时
  • @lily 是的,所以我提供了一个可选答案,您可以阅读我之前的评论 :)
  • 是的,我做到了。谢谢先生 :) 现在效果更好并且理解得更好。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多