簡體   English   中英

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
-用戶身份

更新:

在第一個變量下面,我需要獲取所有喜歡的帖子,但是我真的只需要從表中選擇post_id,因為它將在dataprovider中使用,然后它將獲取所有ID都位於喜歡的變量內的帖子(需要創建可能是變量數組?)

    $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()我會得到錯誤

試圖獲取非對象的屬性

您可以通過將相關模型和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有關

對於帶有查詢的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

全部更新()

我認為最后一條評論(使用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]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM