Yii:用model()动态改变模型关系类型 - > with()

时间:2012-10-12 11:55:52

标签: php model yii relationship

我有GoodsCats模型与下一个关系:

public function relations(){
  return array(
    'GoodsCatsContent' => array(self::HAS_MANY, 'GoodsCatsContent', 'parent_id'),
  );
}

现在我想查找所有GoodsCats个元素但有一个子元素(具有特定language_id):

$cats = GoodsCats::model()->with(
  array(
    'GoodsCatsContent'=>array(
      'on'=>'languages_id = 1'
    )
  )
)->findAll();

并记下一个数组,其中每个elemt都像GoodsCats.id=>GoodsCatsContent.name

CHtml::listData(cats, 'id', 'name')

但是现在我收到错误GoodsCats.name not defined。 当我将GoodsCats关系设置为self::HAS_ONE时,一切正常,但我无法为整个项目更改它。 它是否可以设置model()->with()使用未定义的关系类型而不是特定的关系类型?

UPD 我的模特规则:

GoodsCatsContent

public function rules()
{
    return array(
        array('parent_id', 'required'),
        array('active', 'numerical', 'integerOnly'=>true),
        array('parent_id', 'length', 'max'=>10),
        array('name, seo_title, seo_keywords, seo_description', 'length', 'max'=>255),
        array('short_content, content', 'safe'),
        array('id, parent_id, active, name, short_content, content, seo_title, seo_keywords, seo_description', 'safe', 'on'=>'search'),
    );
}

GoodsCats

public function rules()
{
    return array(
        array('active, prior', 'numerical', 'integerOnly'=>true),
        array('photo', 'length', 'max'=>255),
        array('id, photo, active, prior', 'safe', 'on'=>'search'),
    );
}

2 个答案:

答案 0 :(得分:0)

尝试

$cats = GoodsCats::model()->with(
  array(
    'GoodsCatsContent'=>array(
      'condition'=>'languages_id = 1'
    )
  )
)->findAll();

$cats = GoodsCats::model()->with('GoodsCatsContent')->findAll('languages_id = 1');

答案 1 :(得分:0)

您无法动态更改关系类型。

但是,由于您确定使用language_id = 1仅为您提供了一条相关的GoodsCatsContent记录,因此您可以执行此操作,而不是使用listData()

$myList=array();
foreach ($cats as $acat){
    $myList[$acat->id]=isset($acat->GoodsCatsContent[0]->name)? $acat->GoodsCatsContent[0]->name :''; 
    // you need isset incase some of the GoodsCats don't have a related GoodsCatsContent
}
// you can now use $myList as you would have used the array returned by listData()

因为这是一个HAS_MANY关系,每个GoodsCats将有x个相关的GoodsCatsContent记录,因此即使只有1个相关记录,该关系也将始终返回array,并且如果没有相关记录,则为空数组。因此,当有1条相关记录时,relationName[0]将返回该记录。