php - Yii2 ActiveQuery select joinWith for API

php - Yii2 ActiveQuery select joinWith for API

我的客户模型

public function getAddress() {
   return $this->hasMany(Address::className(), ['address_id' => 'address_id']);
}

我的客户控制器

$query = Customer::find()
          ->alias(['a'])
          ->select(['a.*', 'b.address_name', 'b.address_longitude', 'b.address_latitude'])
          ->joinWith([address b])
          ->asArray()
          ->all()
return ["data" => $query];

结果:

{
  "data": [
     {
       "id": "123",
       "name": "abc",
       "address_name": "bcd",
       "address_logitude": "12312.1231",
       "address_latitude": "11232.11213",
       "address": []
     }
  ]
}

预计

{
  "data": [
     {
       "id": "123",
       "name": "abc",
       "address": [
         "address_name": "bcd",
         "address_logitude": "12312.1231",
         "address_latitude": "11232.11213",
       ]
     }
  ]
}

请帮助我.. 我已经尝试了几天找到解决方案,但仍然一无所获。 希望尽快找到解决方案。 :D

你期望的是 eager loading.

您可以使用 with() 而不是 joinWith():

$customers = Customer::find()
      ->alias(['a'])
      ->select(['a.*', 'b.address_name', 'b.address_longitude', 'b.address_latitude'])
      ->with([address b])
      ->all()

您必须按如下方式更改 getAddress()

public function getAddress() {
 return $this->hasMany(Address::className(), ['address_id' => 'id']);
}

要生成此数组,您可以执行以下操作:

$result = [];
foreach($customers as $customer) {
   $result['data'][] = [
      "id" => $customer->id,
      "name" => $customer->name,
      "address"=> [
         "address_name" => $customer->address->name,
          ...
      ]
   ]
}