Browse Source

AR WIP

tags/2.0.0-beta
Qiang Xue 12 years ago
parent
commit
4d049fd97c
  1. 4
      framework/db/ar/ActiveQuery.php
  2. 32
      framework/db/ar/ActiveRelation.php
  3. 2
      tests/unit/data/ar/Order.php

4
framework/db/ar/ActiveQuery.php

@ -95,7 +95,9 @@ class ActiveQuery extends BaseQuery
$class = $this->modelClass; $class = $this->modelClass;
$model = $class::create($row); $model = $class::create($row);
if (!empty($this->with)) { if (!empty($this->with)) {
$this->fetchRelatedModels(array($model), $this->with); $models = array($model);
$this->fetchRelatedModels($models, $this->with);
$model = $models[0];
} }
return $model; return $model;
} }

32
framework/db/ar/ActiveRelation.php

@ -39,9 +39,25 @@ class ActiveRelation extends ActiveQuery
*/ */
public $link; public $link;
/** /**
* @var ActiveRelation * @var array
*/ */
public $via; public $via;
/**
* @var array
*/
public $viaTable;
public function via($modelClass, $properties = array())
{
$this->via = array($modelClass, $properties);
return $this;
}
public function viaTable($tableName, $link, $properties = array())
{
$this->viaTable = array($tableName, $link, $properties);
return $this;
}
public function createCommand($db = null) public function createCommand($db = null)
{ {
@ -53,9 +69,13 @@ class ActiveRelation extends ActiveQuery
public function findWith($name, &$primaryModels) public function findWith($name, &$primaryModels)
{ {
if (empty($this->link) || !is_array($this->link)) { if (!is_array($this->link)) {
throw new \yii\base\Exception('invalid link'); throw new \yii\base\Exception('invalid link');
} }
if ($this->via !== null) {
}
$this->filterByPrimaryModels($primaryModels); $this->filterByPrimaryModels($primaryModels);
if (count($primaryModels) === 1 && !$this->multiple) { if (count($primaryModels) === 1 && !$this->multiple) {
@ -64,7 +84,12 @@ class ActiveRelation extends ActiveQuery
} }
} else { } else {
$models = $this->all(); $models = $this->all();
// distribute models into buckets which are indexed by the link keys $this->bindModels($name, $primaryModels, $models);
}
}
protected function bindModels($name, &$primaryModels, $models)
{
$buckets = array(); $buckets = array();
foreach ($models as $i => $model) { foreach ($models as $i => $model) {
$key = $this->getModelKey($model, array_keys($this->link)); $key = $this->getModelKey($model, array_keys($this->link));
@ -88,7 +113,6 @@ class ActiveRelation extends ActiveQuery
} }
} }
} }
}
protected function getModelKey($model, $attributes) protected function getModelKey($model, $attributes)
{ {

2
tests/unit/data/ar/Order.php

@ -29,7 +29,7 @@ class Order extends ActiveRecord
public function books() public function books()
{ {
return $this->hasMany('Item', array('id' => 'item_id')) return $this->hasMany('Item', array('id' => 'item_id'))
->via('tbl_order_item', array('order_id' => 'id')) ->viaTable('tbl_order_item', array('order_id' => 'id'))
->where(array('category_id' => 1)); ->where(array('category_id' => 1));
} }
} }
Loading…
Cancel
Save