Yii2模型排除相关记录

我有两个相关的表,posts并且hidden_posts,在哪里posts。id对应hidden_posts。post_id.


在我的posts模型中,如果应该隐藏帖子,我有这种关系来返回记录:


  public function getHiddenPosts()

    {

        return $this->hasOne(HiddenPost::className(), ['post_id' => 'id']);

    }

现在我需要返回所有未隐藏的帖子。所以我正在寻找这个伪代码的等价物:


return $this->hasNone(HiddenPost::className(), ['post_id' => 'id'])->all();


也就是说,“显示所有不在 hidden_posts 表中的帖子”。


那么这是否使用外部连接查询,或者是否有一条我找不到的语句在一行中执行此操作?


德玛西亚99
浏览 149回答 3
3回答

HUH函数

你可以这样做。获取隐藏表中未列出的所有帖子:$posts = Post::find()    ->andFilterWhere(['not in',         'post.id',        HiddenPost::find()           ->select(['hidden_post.post_id'])    ->all();无论如何,最好从原始 SQL 语句开始。编写满足您的结果的语句并将其传输到 ActiveRecord 查询。

30秒到达战场

使用 yii2 拥有的函数而不是在模型中添加查询(例如在模型中使用选择查询)可能是一种很好的做法。相反,您可以在 yii2 中使用 ORM 函数,这些函数已经由 gii 内部函数完成,以使 u=您的工作更轻松。添加 * @property YourModel $hidden_post 并在此模型中添加您的 post_id,例如 ( * @property integer $post_id) 以创建关系。public function getHiddenPosts($hidden_post) {    return $this->find()->joinWith('hidden_post')        ->where(['hidden_post' => $hidden_post])        ->all();}

翻翻过去那场雪

可以使用内部连接检索帖子项目$res = Post::find()->select('post.*')->innerJoin('hdn_post', '`post`.`id` = `hdn_post`.`post_id`')->all();
打开App,查看更多内容
随时随地看视频慕课网APP