【问题标题】:Laravel: Get all projects and check if user has liked themLaravel:获取所有项目并检查用户是否喜欢它们
【发布时间】:2021-04-23 14:59:03
【问题描述】:

我想获取所有项目,对于每个项目,我想获取一个属性,例如 is_liked,它表明 current_user(我有他的 ID)是否喜欢这个项目。

用户模型

class User extends Model
{
    public function projects()
    {
        return $this->hasMany(Project::class);
    }

    public function favorite_projects()
    {
        return $this->belongsToMany(Project::class, 'favorite_projects', 'user_id', 'project_id')->withTimestamps();
    }
}

项目模型

class Project extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

用户表

- id
- name

项目表

- id
- user_id
- title

favorite_projects 表

- user_id
- project_id

完成这项工作的最佳方法是什么?我想得到的数据是这样的:

[
    {
        "id": 1,
        "user_id": 3,
        "title": "my title",
        "is_liked": true
    }
]

注意:current_user->id 可能与 project->user_id 相同也可能不同。

【问题讨论】:

    标签: laravel


    【解决方案1】:
    $projects = DB::table('projects')
                   ->join('favorite_projects', 'favorite_projects.project_id', '=', 'projects.id')
                   ->select('projects.*', 'favorite_projects.*')
                   ->where('projects.user_id', Auth::id())
                   ->get();
    

    此连接语句允许您将 2 个表连接在一起,并且对于用户收藏的每个项目,您将看到记录附加的收藏记录。 在 SQL 查询之后执行 dd($projects) 并查看结果是什么样的,然后为每个结果设置相应的 $project['is_liked']

    【讨论】:

    • 这个查询只会给我一个我不想要的收藏项目列表,我希望列表包含所有项目(收藏或不收藏),如果项目被收藏然后添加is_liked 字段。
    • 所以通过上面的查询,你可以做一个->pluck('id')来获取所有喜欢的项目id,然后对于每个用户项目,你可以使用->whereIn()进行收集来检​​查项目是否是在最喜欢的项目 ID 列表中,如果是,则将“is_likes”设置为 true
    • 这样我必须分别获取所有项目并将它们存储在数组中,然后遍历所有项目并将is_liked 设置为 true 如果 project_id 在 favorite_project_ids 列表中。这很好用,但如果可能的话,我试图避免这个 for 循环。
    • 你不需要避免循环,你需要避免数据库查询的循环,因为你已经得到了一个喜欢的项目列表,那么不需要更多的数据库查询,循环通过一个数组不会像做数据库查询那样花费时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 2014-07-28
    • 2013-05-24
    相关资源
    最近更新 更多