2015-04-14 21 views
1

为我使用的公司工作的程序员已经退出了,所以我一直在学习Yii。我认为如果你了解Yii,这个解决方案很简单,但对我来说并不那么明显。如何通过Yii中的链接表从一个表中获取行?

我有三个表:

| Store | Brand | link_store_brand | 
|-------|-------|------------------| 
| id | id | storeID   | 
|  |  | brandID   | 

现在我需要取一个与存储相关联的所有品牌

我有这样的代码在我的商店模式:

public function relations() 
{ 
    return array(
     'brands' => array(CActiveRecord::MANY_MANY, 
      'Brand', 
      'link_store_brand(storeID, brandID)', 
      'order' => 'brands.rank DESC, brands.name ASC', 
      'with' => 'logo'), 
    ); 
} 

所以在我的控制器我这样做:

$store   = Store::model()->findByPk($requestData->id); 
    $brands   = $store->getBrands(); 

我知道我可以做Store::model()->with('brands')->findByPk()。但是现场命名问题会导致SQL查询失败。所以我首先检索商店数据,然后获取品牌。

$store->getBrands()不工作(SQL失败),所以我想我必须使用查询生成器并使我自己的查询来获取品牌。但我该怎么做?

+0

什么是确切的错误为什么SQL失败? – Bfcm

回答

1

你应该以这种方式定义了两个Many To Many关系link_store_brand之间StoreBrand,:

Store:

public function relations() 
{ 

    return array(
     'link_store_brand' => array(self::HAS_MANY, 'LinkStoreBrand', 'store_id'), 
    ); 
} 

Brand:

public function relations() 
{ 

    return array(
     'link_store_brand' => array(self::HAS_MANY, 'LinkStoreBrand', 'brand_id'), 
    ); 
} 

LinkStoreBrand:

现在
public function relations() 
{ 

    return array(
     'store' => array(self::BELONGS_TO, 'Store', 'store_id'), 
     'brand' => array(self::BELONGS_TO, 'Brand', 'brand_id'), 
    ); 
} 

,如果您要访问的所有品牌的商店,你可以这样做:

$links = LinkStoreBrand::model()->with("brand")->find("store_id = :store_id", array(":store_id"=>$requestData->id)); 
//$links will be an array 
$brands = array(); 
foreach($links as $link) 
{ 
    array_push($brands, $link->brand); 
} 

现在,$brands是与一个商店相关琳琅满目的品牌。

注意:如果您尚未生成表,您必须生成LinkStoreBrand表。

相关问题