Yii2从两个表中选择数据

时间:2015-09-23 19:09:59

标签: php mysql yii2

如何从关系表中选择列?

$orders=Category::find()
->joinWith('posts')
->all();

我试过了

$orders=Category::find()
->select('post.*')
->joinWith('posts')
->all() 

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

Excecute Sql statment : SELECT `post`.* FROM `category` LEFT JOIN `post` ON `category`.`id_category` = `post`.`id_categoryFK`

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

1 个答案:

答案 0 :(得分:10)

这个Yii2 Wiki Article有一个非常好的解释。但我会使用您的输入简化该文章。

您可能有两个要加入的模型:common\models\Categorycommon\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']);
}

1.2编辑Post模型

common\models\Post中添加以下行:

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

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;

3。继续学习

正如我在开始时所说,Yii2 Wiki Article会在大多数情况下帮助您。另一个Yii2 official guide也非常好。

快乐的编码!