如何过滤我的数据库查询结果以不显示任何重复的外键? Laravel

时间:2015-01-27 08:16:26

标签: php mysql database laravel eloquent

我是php的新手并使用Laravel创建项目。我不确定要问这个问题的正确方法,所以我将开始解释。

用户个人资料的部分显示用户参与的活动列表。用户可以多次发布他们参与的活动。我想列出用户在其个人资料中发布的所有活动。我不希望任何活动被多次列出。因此,如果用户玩曲棍球,那么我只想在列表中显示一次曲棍球。

这个关系有3个表

用户表:

| id | user_name | updated_at | created_at |
--------------------------------------------
| 1  | JohnSmith |            | xxxxxxxxxx |

活动表:

| 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 |            |

资源表(每行代表一个帖子):

| 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');
    }

}

活动模型:

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'));
    }

PostRepository:

public function getAllActivities($id)
    {
        return Resource::with('activity')->where('user_id', '=', $id)->get();
    }

UserRepository:

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

但我不想重复任何活动。我只想知道用户是否进行了活动,而不是活动的每个实例。当多次出现时,有没有办法只获取一个实例?

我的理想输出是

- Hockey
- Soccer
- Skiing
- Running

1 个答案:

答案 0 :(得分:1)

你可以试试这个:

$activities = Activity::whereHas('resource', function($q) use ($id){
    $q->where('user_id', $id);
})->get();