【问题标题】:Laravel 4 Eloquent selectLaravel 4 雄辩的选择
【发布时间】:2014-02-22 17:32:11
【问题描述】:

我有 3 张桌子

--- 帖子(所有帖子) 行 = id、标题、内容

--- 板子(所有板子) 行 = id, 标题

--- board_post (板和帖子之间的链接:很多 很多) rows = board_id, post_id

2 个名为 board 和 post 的 Eloquent 类

现在我很想根据 board_post 从一个板上选择所有帖子

我在想: Posts::whereIn('id', $board->post_ids())

我怎么能做到这一点,首先 如果我这样做 Board::find(1)->post_ids 我会得到该板的所有帖子 ID

然后我怎么能从中得到所有的帖子对象呢?

你好,格伦

【问题讨论】:

    标签: php mysql laravel-4 eloquent


    【解决方案1】:

    您为什么对帖子和板使用多对多关系?这很可能是一对多的关系:一个 Board 可能有多个帖子,但一个 Post 应该只属于一个 board(这将简化您的数据库结构以删除 board_post 表)。

    你会这样做:

    Board 类内部:

    public function posts() {
      return $this->hasMany('Post', 'board_id');
    } 
    

    然后,Board::find(1)->posts 将为您提供该板的所有帖子(使用帖子,而不是帖子())。


    要使用您当前的数据库设置,请改用belongsToMany:

    public function posts() {
      return $this->belongsToMany('Post', 'board_post');
    } 
    

    如果你想加载一个包含所有帖子的董事会(急切加载),请使用:

    Board::with('posts')->find(1)
    

    否则,只是为了获取特定版块的帖子,请使用:

    Board::find(1)->posts
    

    【讨论】:

    • 不,一个帖子可以在多个版块中存在:)
    • @Kiwi 有趣的是,在这种情况下,第二个功能应该可以工作,您仍然可以通过 Board::find(1)->posts 之类的方式获取帖子
    【解决方案2】:

    在 Board 模型中确保你定义了 belongsToMany 关系

    public function posts()
    {
        return $this->belongsToMany('Post', 'board_post');
    }
    

    现在你应该可以这样做了:

    Board::find({id})->posts
    

    其他阅读材料:http://laravel.com/docs/eloquent#relationships

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-23
      • 2018-06-27
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 2015-06-01
      相关资源
      最近更新 更多