首页 > 解决方案 > 在 Yi2 中查询并检查另一个表中的关系

问题描述

我正在尝试在 Yii2 表调用 Post 中获取数据。该表有一个属性调用所有者,我想检查所有者的值是否等于我通过调用它的特定值 userId 或所有者的值等于 Followship 表的以下属性,其中关注者属性的值Followship Table 的值等于我传递的值,称为 userId。在逻辑上一点一点地实现上述内容时,我编写了以下代码;

     $allpost  = Post::find()->all();
     $relevantpost = [];
     foreach ($allpost as $post) {
        if($post->owner == $userId){
            $relevantpost[] = $post;
        }
        else{
            $follower = Followship::findOne(['follower'=>$userId, 'following'=>$post->owner]);
            if($follower){
                $relevantpost[] = $post;
            }
        }
     }
     return $relevantpost;

此代码运行良好,但我想为此编写一个活动查询,例如;

$allpost  = Post::find()
                    ->where(['owner'=>$userId])
                    ->orWhere(['is NOT', $follower = Followship::findOne(['follower'=>$userId]) and 'owner' => $follower->following, NULL])
                    ->all();

或者在更坏的情况下,

$allpost = \Yii::$app->db
            ->createCommand(
                "SELECT postId, location, details, created_at FROM Post
                     WHERE owner = " . $userId. "OR
                        owner = '0' OR
                        owner = following IN (
                            SELECT following FROM Followship WHERE follower = ". $userId . " AND 
                            )
                ORDER BY dateCreated DESC"    
            )
            ->queryAll();

我不断收到上述查询的错误。我错过了 Yii2 查询构建器的基础知识。请对此提供任何帮助,我们将不胜感激。

标签: phpyii2

解决方案


首先,您可以在 Post 类中建立关系(通过帖子所有者连接帖子和关注者)

 class Post extends ActiveRecord {

       public function getFollowersDataset() {
          return $this->hasMany(Followers::className(), ['following' => 'owner']);
       } 
    ...
    }

然后你可以在你的查询中使用它

Post::find()
       ->joinWith('followersDataset')
       ->where(['or', 
          ['owner' => $user_id],  
          ['follower' => $user_id]])
       ->all()

推荐阅读