我正在尝试使用多对多关系来完成以下工作流程:
有很多部分和很多用户。每个用户都有他们已解锁的部分。因此,例如,如果有两个部分(第一部分和第二部分)第一个用户Jim(id = 1
)已解锁部分X,则第二个用户Debbie(id = 2
)已解锁部分我和我。
为实现这一目标,我有三个数据库,一个标准的Laravel users
,然后一个sections
存储部分数据id = 1
用于第一部分和id = 2
对于第II节),然后是user_section
我已成功用作User
和Section
模型之间的联合表。该连接表是用户和部分混合的地方,如果该部分中有给定user_id
的条目,则相应的section_id
将被解锁。
我有以下功能,它应该是1.获取视图的所有部分和2.让我知道哪些部分是由用户解锁的。
问题是我得到重复的部分显示,所以它会说第一部分被解锁,然后部分I被锁定在同一个视图中,这必须是我如何遍历和比较数组。通过对代码的调整(我放置break
的地方,我可以摆脱重复,但是错误的部分被锁定。
我的逻辑在这里:
public function getSections(){
$arrayofuserSections = array();
$tempArray = array();
$user = User::where("id",Auth::user()->id)->first();
foreach ($user->section as $section) {
$tempArray['Name'] = $section["name"];
$tempArray['Goals'] = $section["goals"];
array_push($arrayofuserSections,$tempArray);
}
$finarray = array();
$sections=Section::orderBy('order')->get();
foreach ($sections as $section) {
foreach($arrayofuserSections as $arraysection){
if($section->name == $arraysection["Name"])
{
$arraysection["Unlocked"] = 1;
array_push($finarray,$arraysection);
}
else{
$arraysection["Unlocked"] = 0;
$arraysection["Name"] = $section->name;
$arraysection["Goals"] = "";
array_push($finarray,$arraysection);
}
break;
}
}
return $finarray;
}
$user->section
源自User
模型上的方法,此处为:
public function section()
{
return $this->belongsToMany('App\Models\Section','user_section')->withTimestamps();
}
我为Debbie用户播种的是:
DB::table('user_section')->insert([
'user_id' => 2,
'section_id'=>1
]);
DB::table('user_section')->insert([
'user_id' => 2,
'section_id'=>2
]);
但是当我以Debbie身份登录时,我得到以下结果:
所以尽管黛比在连接表中都有两个部分,但只有其中一个部分解锁,如果我移除或移动中断,这又会改变。
答案 0 :(得分:1)
我认为你是从错误的方向来到这里的。
如果您已正确设置关系,则应该能够访问用户和部分用户的部分。
// Find user with sections they have unlocked
$user = User::with('sections')->findOrFail(1);
// Find sections with users who have unlocked them
$section = Section::with('users')->findOrFail(1);
如果从部分方向处理此问题,您可以执行以下操作:
// Find current user id
$userId = Auth::id();
// Find all sections with users who have unlocked them, limited to only the current user
$sections = Section::with([
'users' => function ($query) use ($userId) {
return $query->where('id', $userId);
}
])->get();
这将为您提供所有部分,并急切加载用户关系,即当前用户。因此,如果用户关系为空,则当前用户尚未解锁该部分。