【问题标题】:yii2 get related recordsyii2 获取相关记录
【发布时间】:2016-01-10 16:00:42
【问题描述】:

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

我可以在我的视图中使用以下内容访问帖子数据:

<?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,因为它将在 dataprovider 中使用,然后它将获取所有 id 属于 likepost 变量的帖子(可能需要创建一个变量数组吗?)

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

UPDATE 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() 会出现错误

试图获取非对象的属性

【问题讨论】:

  • 你问的不是很清楚。
  • @MarcoAltieri 我想要呈现部分的列表视图小部件但是我无法使用它,因为它包含以下 $model->title 使用我有权访问的数据获取标题我必须使用 $post->likedpost['title']

标签: php mysql database yii2


【解决方案1】:

您可以将相关模型和 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' =&gt; $provider

全部更新()

我认为最后一条评论(使用 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]);

【讨论】:

  • 仍在苦苦挣扎,很难用问题来描述,但我已经更新了这个问题,这可能会帮助您了解我正在尝试做的事情。
  • 在你的更新中你得到的是模型而不是数据提供者。如果你想获得数据提供者,你需要一个数据提供者和你的查询......十分钟,我更新答案..
  • 当它到达查询行时出现以下错误尝试获取非对象的属性
  • 似乎您的 $likedposts 没有得到结果...然后无效结果 $likedpost->post_id 检查 $likedposts 的正确结果...
  • 我已经更新了我的问题并取得了一些进展,我知道它并不理想,可能应该转移到我的模型中,但我只是想让它工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-24
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 2017-04-22
相关资源
最近更新 更多