3 回答
TA贡献2019条经验 获得超9个赞
您正在使用all()获取类别列表,这将为您提供格式的行数组:
[
['id' => 1],
// ...
],
但是对于您的下一个查询,您需要一个简单的 ID 列表 - 您可以通过使用column()方法来实现这一点:
// Get active categories
$active_cat = Category::find()
->where(['status' => SystemCode::STATUS_ACTIVE])
->andWhere(['is_deleted' => 0])
->select(['id'])
->column();
// Get available articles
$query = Articles::find()
->where(['in', 'cat_id', $active_cat]);
TA贡献1951条经验 获得超3个赞
假设您在和之间存在一对多关系Articles,Category定义如下:
/**
* @return \yii\db\ActiveQuery
*/
public function getCategory()
{
return $this->hasOne(Category::class, ['id' => 'cat_id']);
}
您可以获得所有Articles记录,status = SYSTEM_CODE::STATUS_ACTIVE如下所示:
$articles = $query = Articles::find()->joinWith('category')
->where([
'category.status' => SYSTEM_CODE::STATUS_ACTIVE,
'category.is_deleted' => 0
])->all();
相反,如果关系是多对多的,它的定义如下:
/**
* @return \yii\db\ActiveQuery
*/
public function getCategories()
{
return $this->hasMany(
Category::className(),
['id' => 'cat_id'])->viaTable(
'article_category', ['article_id' => 'id']
);
}
然后你可以得到这样的结果:
$articles = $query = Articles::find()->joinWith('categories')
->where([
'category.status' => SYSTEM_CODE::STATUS_ACTIVE,
'category.is_deleted' => 0
])->all();
在第二个示例中,只有关系的名称发生了变化。
请注意,我做了一些假设,比如category表的名称是category,被调用的连接表article_category等等,您可能需要修改示例以适合您的代码。
joinWith()的文档。
TA贡献1785条经验 获得超8个赞
请注意每个方法的返回值:
one() 此方法返回一个 ActiveRecord 对象,如果未找到则返回 null。
one() 执行查询并返回单行结果。
all()此方法返回 ActiveRecord 对象列表或空数组(如果未找到)
all() 执行查询并将所有结果作为数组返回。所以在
all()
方法中:foreach($active_cat as $cat){ # code...}
这里当然可以通过“关系数据”访问第二张表
asArray()是否以数组形式返回查询结果,而不是以活动记录形式返回。
还:
yii\db\ActiveRecord::findOne():返回一个填充了查询结果第一行的 Active Record 实例。(通过主键或列值数组返回单个活动记录模型实例)
yii\db\ActiveRecord::findAll():返回填充了所有查询结果的 Active Record 实例数组。(匹配指定主键值或一组列值的活动记录模型列表。)
- 3 回答
- 0 关注
- 167 浏览
添加回答
举报