【问题标题】:Yii: search by a HAS_MANY relationYii:按 HAS_MANY 关系搜索
【发布时间】:2025-12-20 10:55:12
【问题描述】:

我有以下表格

notice[id, type], 
property[id, type], 
property_value[id, notice_id, property_id, value].

每个通知都有其类型指定的属性。我需要同时通过几个属性进行过滤,问题是如何指定哪个属性应该具有指定值?

class Notice extends CActiveRecord{

  /** @var array property_id=>value from $_GET*/
  public $searchParams= array();

  public function search() {

    $criteria = new CDbCriteria;
    // $criteria->together = true;
    $criteria->compare('t.type', $this->type);

    foreach ( $searchParams as $property_id => $value) {
      /// What should i write here?
      /// $criteria->compare('propertyValues.id', $id);
      /// $criteria->compare('propertyValues.value', $value);
    }
  }
}

Ps:找到 thisthis 但我需要指定参数...

【问题讨论】:

  • $criteria->with = array('YOUR_TABLE' => array('alias' => 'nt')); // 它加入你指定的表
  • zazu,是的,你是对的,忘记写了,但这不是重点:例如:我在 3 楼有一个公寓要搜索,有 4 个房间,这两个参数都存储了在一列中...
  • 你能解释/告诉我每个模型类的关系()吗?如果你有正确的关系,这很容易()
  • @Skatox 抱歉,回答迟了,但我发现我的问题是围绕 EAV 模型...通知模型中有一个关系 ('propertyValues' => array(self::HAS_MANY, 'propertyValue ', 'notice_id')) 和 PropertyValue 中的一个 ('property' => array(self::BELONGS_TO, 'Property', 'property_id'))

标签: yii


【解决方案1】:

我发现这个问题与经典 EAV 模型(实体-属性-值)有关。因此,对于临时(但不是最好的)解决方案,我将每个参数的值的表相乘:

 public function search() {    
   foreach ($properties as $id => $value) {
     $joinAlias = 'p_' . $property->id;
     $join = "\nLEFT JOIN property_value as $joinAlias ON t.id= {$joinAlias}.notice_id AND {$joinAlias}.property_id='{$property_id}'  ";
     $criteria->compare("{$joinAlias}.value", $value);
     $criteria->join .= $join;
   }
 }  

【讨论】: