使用AR findAll函数在使用with语句时只返回一个对象

时间:2013-01-29 16:45:06

标签: php activerecord yii

我的Yii安装存在问题,我正在尝试获得一个相当基本的查询,但我没有得到结果,在线教程说我应该得到。我有两个看起来大致如此的模型:

定价:

class Pricing extends CActiveRecord
{
/**
 * Returns the static model of the specified AR class.
 * @param string $className active record class name.
 * @return Pricing the static model class
 */
public static function model($className=__CLASS__)
{
    return parent::model($className);
}

/**
 * @return string the associated database table name
 */
public function tableName()
{
    return 'pricing';
}

/**
* @return string the primary key
*/
public function primaryKey(){
    return 'ID';
}

...

/**
 * @return array relational rules.
 */
public function relations()
{
    // NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    return array(
        'xpricing_routes' => array(self::HAS_MANY, 'PricingRoutes', 'ID_pricing'),
    );
}

和PricingRoutes:

class PricingRoutes extends CActiveRecord
{
/**
 * Returns the static model of the specified AR class.
 * @param string $className active record class name.
 * @return PricingRoutes the static model class
 */
public static function model($className=__CLASS__)
{
    return parent::model($className);
}

/**
 * @return string the associated database table name
 */
public function tableName()
{
    return 'pricing_routes';
}

/**
* @return string the primary key
*/
public function primaryKey(){
    return 'ID';
}
...
/**
 * @return array relational rules.
 */
public function relations()
{
    // NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    return array(
        'xpricing' => array(self::BELONGS_TO, 'Pricing', 'ID_pricing'),
    );
}

然后在控制器中我们有:

$criteria = new CDbCriteria;
$criteria->with = array('xpricing_routes'); 
$criteria->together=true;       

$pricing_records = Pricing::model()->findAll($criteria);
$pricing_records_arr = CHtml::listData($pricing_records, 'id', 'name');

echo '<pre>';
print_r($pricing_records);
print_r($pricing_record_arr);
echo '</pre>';

您可能已经知道,我们有两个名为pricing和pricing_routes的表。定价路由表有一个名为ID_pricing的外键,它转到定价表中的ID字段。定价表有一个条目,pricing_routes表有4个条目,它们都具有ID_pricing字段中定价表中一个项目的主键。所以我们应该得到4个结果给我们正在运行的查询,当我运行Yii用AR生成的查询时,这就是我得到的。

我们遇到的问题是$ pricing_records变量是一个只有一个Pricing对象的数组。该对象包含我们需要的数据,但不是真正可用的数据。 $ pricing_records_arr变量只是一个空数组。我找到的文档似乎表明我们应该获得一组定价对象,每个定价对象都包含来自pricing_routes表的信息。我们知道使用AR可能不是获取此数据的最佳方式,但我们有理由让这一点发挥作用,因此我们非常感谢有关如何做到这一点的任何想法。

编辑:

事实证明,这最终误解了我的回归。对这个问题的评论给了我所需要的信息。

2 个答案:

答案 0 :(得分:1)

如果你打电话

$pricing_records = Pricing::model()->findAll($criteria);

您只会获得一条活动记录,其中的属性已填充表格中的值&#34;定价&#34;。 如果你想从&#34; pricing_routes&#34;获得所有记录。属于这个特定的&#34;定价&#34;你必须打电话

$pricing_records->xpricing_routes

其中&#34; xpricing_routes&#34;是您在模型中正确定义的关系的名称。它返回PricingRoutes数组,如果没有匹配的记录,则返回null。

答案 1 :(得分:0)

如果你使用findall它会返回一个数组,即使有一个记录


$pricing_records = Pricing::model()->findAll($criteria);
foreach($pricing_records as $var){
$var->xpricing_routes->ID_pricing;//any variable
}

或 如果只有一个字段可以使用



$pricing_records = Pricing::model()->find($criteria);
$pricing_records->xpricing_routes->ID_pricing;//any variable