yii2获取相关记录


yii2 get related records

我想使用listview小部件显示用户喜欢的帖子,因此数据提供者必须包含正确的记录,因为我不想在我的视图中进行任何查询。

在我看来,我可以使用以下方式访问帖子数据:

<?php foreach ($likedposts as $post) { ?>
    <?php var_dump($post->likedpost['title']); ?>
<?php } ?>

我的控制器如下:

public function actionIndex()
{
    $user_id = Yii::$app->user->id; 
    $likedposts =  Likedposts::find()->where([ 'user_id' => $user_id])->all();
    return $this->render('index', [
        'likedposts' => $likedposts,
    ]);
}

我希望能够访问数据,例如下面这样的:

<?php foreach ($likedposts as $model) { ?>
    <?php var_dump($model->title); ?>
<?php } ?>

架构用户
-id
-名称
-电子邮件
-密码

博客文章
-id
-标题
-内容

喜欢的帖子
-id
-post_id
-user_id

更新:

下面的第一个变量我需要获得所有喜欢的帖子,但我只需要从表中选择post_id,因为它将在数据提供程序中使用,然后数据提供程序将获得id属于likedpost变量的所有帖子(可能需要创建一个变量数组?)

    $likedposts =  Likedposts::find()->where([ 'user_id' => $user_id])->all();
    $dataProvider = Posts::find()->where(['id'] => $likedposts->post_id])->all();

更新2(仅适用于一条/单个记录)

    $user_id = Yii::$app->user->id; 
    //if i can change ->one() to all() it breaks
    $likedposts =  Likedposts::find()->where([ 'user_id' => $user_id])->one();
    $DataProvider = new ActiveDataProvider([
            'query' => Posts::find()->
                where(['id' => $likedposts->post_id])->
                orderBy('id DESC'),
            'pagination' => [
                'pageSize' => 20,
            ],
        ]);

    return $this->render('index', [
        'DataProvider' => $DataProvider,
    ]);

如果我使用all(),我会得到错误

正在尝试获取非对象的属性

您可以将相关模型和dataProvider传递到视图。。

我不知道你的代码,所以我只能以模拟的方式做一些建议

public function actionIndex()
{
   $user_id = Yii::$app->user->id; 
   $modellUser = User::find()->where(['id'=> $_user])->one();
  $modelBlogPost = BlogPost::find()->where(['user_id' => $user_id])->one();
  $searchModel = new 'common'models'LikedpostsSearch();
  $dataProviderLikedposts= $searchModel->search(Yii::$app->request->queryParams);
  $dataProviderLikedposts->query->andWhere('User  = ' . $User_id );
    return $this->render('index', [
      'modelUser' => $modelUser,
      'modelBlogPost' =$modelBlogPost,
      'dataProviderLikedposts' => $dataProviderLikedposts,
    ]);
}

在您看来

你可以

创建一个:

 detailView with  the $modelUser  for user information
 <?=  DetailView::widget([
    'model' => $modelUser,
    'mode' => 'view',
    'attributes' => [
       .....
    ],
 ]) ?>

detailView with the $modelBlogPost for the blog post information
<?=  DetailView::widget([
    'model' => $modelBlogPost,
    'mode' => 'view',
    'attributes' => [
       .....
    ],
  ]) ?>

listView with the $dataProvideLikedpost for the likedpost information ..

<?= ListView::widget( [
  'dataProvider' => $dataProviderLikedposts,
  .....
 ] ); ?>

我希望这个元素能为你提供正确的解决方案如果问题仅与获得数据提供商有关,如您需要

对于带有查询的dataProvider,您应该创建查询

$likedposts =  Likedposts::find()->where([ 'user_id' => $user_id])->all();
// only the query whitout all otherwise you obtain the models not the dataProvider
$query = Posts::find()->where(['id'] => $likedposts->post_id]);

使用查询创建新的dataProvider

 $provider = new ActiveDataProvider([
 'query' => $query,
'pagination' => [
    'pageSize' => 20,
],

]);

然后在渲染视图中传递此'dataProvider' => $provider

更新all()

我认为最后一条评论(使用one()而不是all())与$likedposts中的结果是一个模型集合这一事实有关。在这种情况下,likedposts->post_id不包含post_id的数组,而是一个非对象(对象将是$likedposts['0']->post_id)。。

在您的查询中,您需要一个向量/数组,其中包含用户喜欢的post_id集合。

foreach ($likedposts as $key => $value) { 
    myArray[] = $value;
}

$query = Posts::find()->where( 'id IN ' . $myArray);
or 
$query = Posts::find()->where(['id'] => $myArray]);