Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Yii Framework 2.0从左表获取数据,该表在右选项卡中不作为外键存在_Php_Relational Database_Yii2_Jointable - Fatal编程技术网

Php Yii Framework 2.0从左表获取数据,该表在右选项卡中不作为外键存在

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”表

使用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 = 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();但它不起作用。