Db schema:
class Order extends \yii\db\ActiveRecord
{
public $id;
public $user_id;
}
public DeliveryTypes extends \yii\db\ActiveRecord
{
public $order_id;
public $type_name;
}
class OrderVip extends \yii\db\ActiveRecord
{
public function getOrder()
{
return $this->hasOne(Order::class, ['id' => 'order_id']);
}
public function getDeliveryTypes()
{
return $this->hasMany(OrderDelivery::className(), ['order_id' => 'id'])->via('order')
}
}
Code example:
$order = new Order;
$order->user_id = UserFacade::getCurrentUserId();
$orderVip = new OrderVip();
$orderVip->populateRelation('order', $order);
If i call:
$deliveryTypes = $orderVip->deliveryTypes;
$oderVip->order is null now!
Bug in code:
class yii\db\ActiveQuery
function: public function prepare($builder)
list($viaName, $viaQuery) = $this->via;
if ($viaQuery->multiple) {
$viaModels = $viaQuery->all();
$this->primaryModel->populateRelation($viaName, $viaModels);
} else {
$model = $viaQuery->one();
$this->primaryModel->populateRelation($viaName, $model);
$viaModels = $model === null ? [] : [$model];
}
$this->filterByModels($viaModels);
I think it need checking if relation exists:
list($viaName, $viaQuery) = $this->via;
if ($this->primaryModel->isRelationPopulated($viaName)) {
$viaModels = $this->primaryModel->getRelatedRecords()[$viaName];
} else {
if ($viaQuery->multiple) {
$viaModels = $viaQuery->all();
$this->primaryModel->populateRelation($viaName, $viaModels);
} else {
$model = $viaQuery->one();
$this->primaryModel->populateRelation($viaName, $model);
$viaModels = $model === null ? [] : [$model];
}
}
$this->filterByModels($viaModels);