Php Yii Framework 2.0从左表获取数据,该表在右选项卡中不作为外键存在
使用YIIFramework2.0,我有两个数据库表(A和B)。它是一个关系数据库1:n。A只有一个B,但B有许多A。我的数据库看起来与此类似Php Yii Framework 2.0从左表获取数据,该表在右选项卡中不作为外键存在,php,relational-database,yii2,jointable,Php,Relational Database,Yii2,Jointable,使用YIIFramework2.0,我有两个数据库表(A和B)。它是一个关系数据库1:n。A只有一个B,但B有许多A。我的数据库看起来与此类似 A table: id = 1, name = yes id = 2, name = no id = 3, name = ok id = 4, name = good B table: id = 1, a_id = 1 id = 2, a_id = 1 id = 3, a_id = 2 我想从“A”表中检索其主键在“B”表
A table:
id = 1, name = yes
id = 2, name = no
id = 3, name = ok
id = 4, name = good
B table:
id = 1, a_id = 1
id = 2, a_id = 1
id = 3, a_id = 2
我想从“A”表中检索其主键在“B”表中不存在的记录。我想得到的结果是
A table:
id = 3, name = ok
id = 4, name = good
我不想使用下面的代码,因为它对我来说效率不高
$allA = A::find()->all();
foreach($allA as $model) {
if(!$model->getBs()) {
$allAWithoutB[] = $model;
}
}
我如何定义这样一个关系方法或范围BQuery类,这样我就不需要查询所有a记录并在for each循环中过滤它们了?我认为这种逻辑不适合关系 您可以将查询与子查询一起使用。首先,从
b
表中选择所有唯一的a\u id
,然后在a
表中排除它。将此方法放入AModel
中
public function getOtherModels()
{
$subquery = BModel::find()->select('a_id')->distinct()->all();
return static::find()->where(['not in', 'id', $subquery]);
}
如果你愿意,你可以把这个放进去。阿罗加切夫发布的答案几乎是正确的 如果要运行他的方法
getOtherModels()
,则会出现“无法将对象转换为字符串”异常
我下面的方法与此完全相同,只是我将方法设置为static
,并添加了一个foreach
来循环对象,并将a_id
值添加到一个新数组中
我还向该方法添加了$condition
参数,因此您可以向A模型添加条件
/**
* @return \yii\db\ActiveQuery
*/
public static function withoutBModel($condition = null)
{
$subquery = BModel::find()->select('a_id')->distinct()->all();
$arr = [];
foreach ($subquery as $q) {
$arr[] = $q->a_id;
}
$query = static::find()->where(['not in', 'id', $arr]);
if (!empty($condition)) {
$query->andWhere($condition);
}
return $query;
}
该方法的使用如下所示:
$aModelsWithoutB = A::withoutBModel('active = 1')->all();
请您提供更多信息,说明如何调用这个getOtherModels()方法?因为现在我这样尝试:$modelObject->getOtherModels()->all();但它不起作用。