如何过滤我的数据库查询结果以不显示任何重复的外键? Laravel
How do I filter my DB query results to not display any duplicate foreign keys? Laravel
我是 php 的新手,正在使用 Laravel 创建项目。我什至不确定问这个问题的正确方法,所以我将开始解释。
用户个人资料有一个部分显示用户参与的活动列表。用户可以post他们多次参与的活动。我想列出用户 post 在其个人资料中进行的所有活动。我不希望任何 activity 被多次列出。因此,如果用户打曲棍球不止一次,我只想在列表中显示曲棍球一次。
我有 3 table 这段关系
用户table:
| id | user_name | updated_at | created_at |
--------------------------------------------
| 1 | JohnSmith | | xxxxxxxxxx |
活动table:
| id | title | description | created_at | updated_at |
--------------------------------------------------------
| 1 | Hockey | xxxxxxxxxxx | xxxxxxxxxx | |
| 2 | Soccer | xxxxxxxxxxx | xxxxxxxxxx | |
| 3 | Skiing | xxxxxxxxxxx | xxxxxxxxxx | |
| 4 | Biking | xxxxxxxxxxx | xxxxxxxxxx | |
| 5 | Running | xxxxxxxxxxx | xxxxxxxxxx | |
| 6 | Camping | xxxxxxxxxxx | xxxxxxxxxx | |
资源table(每行代表一个post):
| id | user_id | activity_id | created_at | updated_at |
-------------------------------------------------------
| 1 | 1 | 1 | xxxxxxxxxx | |
| 2 | 1 | 2 | xxxxxxxxxx | |
| 3 | 1 | 1 | xxxxxxxxxx | |
| 4 | 1 | 3 | xxxxxxxxxx | |
| 5 | 1 | 3 | xxxxxxxxxx | |
| 6 | 1 | 1 | xxxxxxxxxx | |
| 7 | 1 | 5 | xxxxxxxxxx | |
型号
用户模型:
class User extends Eloquent {
public function posts(){
return $this->hasMany('Acme\Resource\Resource');
}
}
Activity 型号:
class Activity extends Eloquent {
public function resource(){
return $this->hasMany('Acme\Resource\Resource');
}
}
资源模型:
class Resource extends Eloquent {
public function user()
{
return $this->belongsTo('Acme\Users\User', 'user_id');
}
public function activity()
{
return $this->belongsTo('Acme\Activities\Activity', 'activity_id');
}
}
显示活动列表页面的控制器方法:
public function show($id)
{
$posts = $this->postRepository->getAllActivities($id);
$user = $this->userRepository->findById($id);
return View::make('profile', compact('user', 'posts'));
}
后存储库:
public function getAllActivities($id)
{
return Resource::with('activity')->where('user_id', '=', $id)->get();
}
用户资料库:
public function findById($id)
{
return User::findOrFail($id);
}
在我看来,我能够像这样检索用户的所有活动:
<ul>
@foreach ( $posts as $post )
<li>{{ $post->activity->title }}</li>
@endforeach
</ul>
我的结果是:
- Hockey
- Soccer
- Hockey
- Skiing
- Skiing
- Hockey
- Running
但是我不想重复任何活动。我只想知道用户是否执行了 activity,而不是 activity 的每个实例。有没有办法在出现多次时只获取一个实例?
我的理想输出是
- Hockey
- Soccer
- Skiing
- Running
你可以试试这个:
$activities = Activity::whereHas('resource', function($q) use ($id){
$q->where('user_id', $id);
})->get();
我是 php 的新手,正在使用 Laravel 创建项目。我什至不确定问这个问题的正确方法,所以我将开始解释。
用户个人资料有一个部分显示用户参与的活动列表。用户可以post他们多次参与的活动。我想列出用户 post 在其个人资料中进行的所有活动。我不希望任何 activity 被多次列出。因此,如果用户打曲棍球不止一次,我只想在列表中显示曲棍球一次。
我有 3 table 这段关系
用户table:
| id | user_name | updated_at | created_at |
--------------------------------------------
| 1 | JohnSmith | | xxxxxxxxxx |
活动table:
| id | title | description | created_at | updated_at |
--------------------------------------------------------
| 1 | Hockey | xxxxxxxxxxx | xxxxxxxxxx | |
| 2 | Soccer | xxxxxxxxxxx | xxxxxxxxxx | |
| 3 | Skiing | xxxxxxxxxxx | xxxxxxxxxx | |
| 4 | Biking | xxxxxxxxxxx | xxxxxxxxxx | |
| 5 | Running | xxxxxxxxxxx | xxxxxxxxxx | |
| 6 | Camping | xxxxxxxxxxx | xxxxxxxxxx | |
资源table(每行代表一个post):
| id | user_id | activity_id | created_at | updated_at |
-------------------------------------------------------
| 1 | 1 | 1 | xxxxxxxxxx | |
| 2 | 1 | 2 | xxxxxxxxxx | |
| 3 | 1 | 1 | xxxxxxxxxx | |
| 4 | 1 | 3 | xxxxxxxxxx | |
| 5 | 1 | 3 | xxxxxxxxxx | |
| 6 | 1 | 1 | xxxxxxxxxx | |
| 7 | 1 | 5 | xxxxxxxxxx | |
型号
用户模型:
class User extends Eloquent {
public function posts(){
return $this->hasMany('Acme\Resource\Resource');
}
}
Activity 型号:
class Activity extends Eloquent {
public function resource(){
return $this->hasMany('Acme\Resource\Resource');
}
}
资源模型:
class Resource extends Eloquent {
public function user()
{
return $this->belongsTo('Acme\Users\User', 'user_id');
}
public function activity()
{
return $this->belongsTo('Acme\Activities\Activity', 'activity_id');
}
}
显示活动列表页面的控制器方法:
public function show($id)
{
$posts = $this->postRepository->getAllActivities($id);
$user = $this->userRepository->findById($id);
return View::make('profile', compact('user', 'posts'));
}
后存储库:
public function getAllActivities($id)
{
return Resource::with('activity')->where('user_id', '=', $id)->get();
}
用户资料库:
public function findById($id)
{
return User::findOrFail($id);
}
在我看来,我能够像这样检索用户的所有活动:
<ul>
@foreach ( $posts as $post )
<li>{{ $post->activity->title }}</li>
@endforeach
</ul>
我的结果是:
- Hockey
- Soccer
- Hockey
- Skiing
- Skiing
- Hockey
- Running
但是我不想重复任何活动。我只想知道用户是否执行了 activity,而不是 activity 的每个实例。有没有办法在出现多次时只获取一个实例?
我的理想输出是
- Hockey
- Soccer
- Skiing
- Running
你可以试试这个:
$activities = Activity::whereHas('resource', function($q) use ($id){
$q->where('user_id', $id);
})->get();