Yii2从两个表中选择数据

Pek*_*kus 6 php mysql yii2

我如何从关系表中选择列?

$orders=Category::find()
->joinWith('posts')
->all();
Run Code Online (Sandbox Code Playgroud)

我试过了

$orders=Category::find()
->select('post.*')
->joinWith('posts')
->all() 
Run Code Online (Sandbox Code Playgroud)

等,但我得到错误:获取未知属性:common\models\Category :: id_post

Excecute Sql statment : SELECT `post`.* FROM `category` LEFT JOIN `post` ON `category`.`id_category` = `post`.`id_categoryFK`
Run Code Online (Sandbox Code Playgroud)

但我不能使用表格中的列我想从连接表中写入数据

XzA*_*eRo 10

这篇Yii2维基文章中有一个非常好的解释.但我会使用您的输入简化该文章.

您可能有两个要加入的模型:common\models\Category并且common\models\Post所有属性都与数据库中的属性相匹配.而且,让我们说Category 有许多 Post与之相关的,但Post只有一个 Category.

1.定义模型中的关系

首先,你必须让Yii2理解两个模型之间存在关系.Yii2会做一些魔术来帮助你加入表格,但你必须设置模型.

1.1编辑Category模型

common\models\Category加入下面几行:

/**
 * @return \yii\db\ActiveQuery
 */
public function getPosts()
{
    return $this->hasMany(Posts::className(), ['category_id' => 'id_categoryFK']);
}
Run Code Online (Sandbox Code Playgroud)

1.2编辑Post模型

common\models\Post加入下面几行:

/**
 * @return \yii\db\ActiveQuery
 */
public function getCategory()
{
    return $this->hasOne(Post::className(), ['id_categoryFK' => 'category_id']);
}
Run Code Online (Sandbox Code Playgroud)

2.检索数据

现在,从任何控制器,您可以像这样使用它:

/* Access posts from a category*/
$category = common\models\Category::find()->where(['category_id'=>$category_id])->one();
foreach($category->posts as $post) // iterate over all associated posts of category
{
    $postTitle = $post->title; //access data of Post model
}

/* Access category from post */
$post = common\models\Post::find()->where(['id'=>$post_id])->one();
$categoryName = $post->category->category_name;
Run Code Online (Sandbox Code Playgroud)

3.继续学习

正如我在开始时所说,这个Yii2 Wiki文章将在大多数情况下为您提供帮助.这个其他的Yii2官方指南,也很好.

快乐的编码!