鉴于以下表格结构:
table users
- id
- name
table group_user
- id
- group_id
- user_id
table groups
- id
- name
table events
- id
- name
- group_id
我们可以看到User
与Event
个对象有关系,但它必须通过User
到Group
的多对多关系
我不确定这叫做什么样的关系...这是有多少多对多,因为它有很多Event
对象通过users-group_user-groups
的多对多关系?
在任何情况下,我如何为此撰写Laravel查询?
答案 0 :(得分:0)
鉴于$id
是执行调用的用户的ID,我们要查找的SQL查询如下所示:
SELECT * FROM events WHERE group_id IN (
SELECT group_id FROM group_user WHERE user_id = $id
);
因此,如果在您的group_user
表格中,我们发现user_id = 1
的用户具有以下群组关系group_id = [1, 2, 3, 4, 5]
,则生成的查询如下所示:SELECT * FROM events WHERE group_id IN [1, 2, 3, 4, 5];
我们正在寻找什么(与这些团体有关的事件)。
vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php
在hasMany
方法后插入以下代码。
/**
* Define a many-through-many relationship.
*
* @param string $related
* @param string $through
* @param string $pivotTable
* @param string $pivotKey
* @param string $pivotThroughKey
* @param string|null $firstKey
* @param string|null $secondKey
* @return \Illuminate\Database\Eloquent\Relations\HasManyThrough
*/
public function manyThroughMany($related, $through, $pivotTable, $pivotKey, $pivotThroughKey, $firstKey = null, $secondKey = null)
{
$relatedModel = new $related; // App\Event
$relatedTable = $relatedModel->getTable(); // events
$firstKey = $firstKey ?: $this->getForeignKey(); // event_id
$throughModel = new $through; // App\Group
$throughTable = $throughModel->getTable(); // groups
$secondKey = $secondKey ?: $throughModel->getForeignKey(); // group_id
return $relatedModel
->whereIn($secondKey, function ($query) use ($pivotTable, $pivotKey, $pivotThroughKey)
{
return $query
->from($pivotTable)
->where($pivotKey, '=', $this->id)
->select($pivotThroughKey);
})
->select($relatedTable . '.*');
}
现在为你的模特。要使用many-through-many
关系,请转到User
模型并添加以下内容。
public function events()
{
return $this->manyThroughMany('App\Event', 'App\Group', 'group_user', 'user_id', 'group_id');
}
参数如下:
App\Event
)。App\Group
)。group_user
)。user_id
)。group_id
)。我真的不知道是否存在诸多关系这样的事情,或者它的名称是什么。这只是对我有用的代码,所以我想与那些可能和我一样陷入困境的人分享。
如果有更简单的方法,请回答!如果有什么我可以改进,请评论。感谢。