【问题标题】:Table constellation for favoriting a joke喜欢笑话的表星座
【发布时间】:2015-04-09 17:13:40
【问题描述】:

我在空闲时间开发一个小型网络应用程序,现在我想开一些可以被用户喜欢的笑话。

我的桌子是:

----------------
| jokes        |
----------------
| id
| author_id
| content

----------------
| favorites    |
----------------
| id
| joke_id
| user_id

(当然还有像 users 表这样的表,但不是必须的)

我现在不知道如何在模型中建立关系。 我的目标是检索登录用户收藏的所有笑话,例如:

$favorites = Joke::wherePivot('user_id', Auth::user()->id)->get();

这样我就可以像笑话一样访问属性:

$jokes = Joke::all();

在 Blade 模板引擎中

@foreach($jokes as $joke)
  {{ $joke->content }}
@enndforeach

有什么最佳实践吗?我正在运行 Laravel 框架 4.2.17 版。

【问题讨论】:

  • 我不知道你的平台,但我有这样的表。首先我得到joke_ids,它链接到从favorites 表登录的user_id。然后我得到favorite 的详细信息,我得到了joke_id,来自jokes
  • 您的问题是什么?寻找建议和“最佳实践”不是问题。

标签: mysql laravel-4 eloquent


【解决方案1】:

你可以用mysql查询 假设 userid =u0001

SELECT j.id,j.author_id,j.Content,f.user_id
FROM jokes j 
JOIN favorites f 
ON j.id=f.jokeid
WHERE f.user_id='u0001'

【讨论】:

    【解决方案2】:

    我会按如下方式创建收藏夹表:

    joke_id | user_id

    将主键放在两个字段上。 如果您想让它“完美”,请在分别指向笑话和用户表的各个字段上放置一个单独的外键。

    每次登录的用户收藏一个笑话时,都会存储 joke_id 和 user_id。

    检索

    SELECT j.*
    FROM jokes j 
    INNER JOIN favorites f ON j.id=f.joke_id
    WHERE f.user_id= $userId
    

    使用 Laravel 查询构建器:

    DB::table('jokes')
                ->join('favorites', 'jokes.id', '=', 'favorites.joke_id')
                ->where('favorites.user_id', '=', $userId)
                ->get();
    

    【讨论】:

    • 酷,感谢您的回复!但是您将如何设置模型中的关系?
    • 你使用的是 Laravel 自带的“默认”Eloquent 模型吗?
    • 是的,我喜欢: > function favorites() { > return $this->hasMany('Favorit', 'favorites', 'user_id', 'joke_id'); > }
    • 我不是一个非常频繁的 Laravel 用户,但如果我确实使用它,我通常会采用 Query Builder 方法,因为老实说,我发现它更灵活且更易于使用。我为您编辑了答案以使用查询生成器。如果你想通过 ORM 来做,可以在这里找到:Eloquent ORM,专门搜索“Has Many Through”关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 2018-06-26
    相关资源
    最近更新 更多