我想显示用户喜欢使用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都位于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有关
对于带有查询的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]);
关于php - yii2获取相关记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34697697/