0

所以我想用 yii 做的有点复杂。

数据库
我有一个城市、一个 city_has_product 和一个产品表。所以城市是 MANY_TO_MANY,产品通过 city_has_product。city_has_product 有一个名为 amount 的列。

为了了解 FK 和 PK 名称,这里有 FK 和 PK 表:

城市
ID

city_has_product
city_id
product_id

产品
ID


我想要什么作为我想要的模型
,我可以这样做: $city->products[0]->amount
所以金额值来自 city_has_product 到 Product(在模型层中)

到目前为止,我是
City 有这种关系:

return array(
  'city_has_product'=> array(self::HAS_MANY, 'CityHasProduct', 'city_id'),
  'products'=> array(self::HAS_MANY, 'Product', array('product_id'=>'id'), 'through' => 'city_has_product'),
);

CityHasProducts 没有关系 Product 有这个关系:

return array(
 'city_has_product'=> array(self::HAS_MANY, 'CityHasProduct', 'product_id'),
 'city'=> array(self::HAS_ONE, 'City', array('city_id'=>'id'), 'through' => 'city_has_product'),
 'hasAmount' => array(self::STAT, 'CityHasProduct', 'product_id', 'select'=>'amount'),
);

我的解决方案有问题
hasAmount 忽略了城市。我用 'condition'='city_id=city.id' 试过,但没有奏效。我不知道如何从 Product 访问 city.id,因为我与城市没有直接关系,因为在 db 级别产品和城市是 MANY_TO_MANY。

问题
1. 这可能与 yii 有关系吗?
2. 如何从 Product 中获取 city.id?
3. 我在正确的轨道上吗?如果不是如何获得我想要的这个模型?

感谢您的所有回答:)

4

2 回答 2

0

我有table City (city_id, name)和。一切看起来都像你,对吧?table Product (product_id, name)table city_has_product (city_id, product_id, amount)

1/有MANY to MANY关系,如果你不提供city_idand product_id,你永远不会得到两个对象的数量Cityand Product

2/ 好的,我们需要两个city_idand product_id,但是你如何通过并让它们一起工作以从 category_has_product 中获取数量?是不是跟跟着snipet一样?

$city->products[0]->金额

哦,我们现在有问题了,肯定是错的。不要认为你得到了 city_id (来自$city)和 product_id (来自$product索引 0)然后amount应该来自Product. 不,它没有。我们都知道该amount列在CityHasProductmodel 中,而不是Cityor Product,那么amount绝对不是 Product 或 City 属性。

3/ 您在 City 和 Product 上建立了关系,但它们如何适合您的目的。让我们看看以下查询:

$product_id = 2;
$city_id = 4;
    $product = Product::model()->with(array(
        'cities' => array(
            'condition'=>'cities.city_id = :city_id',
            'params' => array(':city_id' => $city_id)
        )

    ))->findByAttributes(array('product_id'=>$product_id));

//it return Product model.

//or we can do samething from City model

但是等等,我们在这里做什么?Product为什么我必须执行上述查询然后继续找出Category当我已经确切知道城市和产品(通过 city_id 和 product_id)时,是的,在这种情况下,这似乎很愚蠢

4/ 最后,我问自己为什么不能像下面的查询那样简单:

$rls = CityHasProduct::model()->findByAttributes(array( 'city_id' => $city_id, 'product_id' => $product_id));

现在您可以访问城市和产品,如下所示

$rts->amount;
$city = $rls->city->name; //BELONG_TO relation on CityHasProduct model
$product= $rls->product->name; //BELONG_TO relation on CityHasProduct model

CityHasProduct 模型关系应该是

return array(
            'product' => array(self::BELONGS_TO, 'Product',  array('product_id'=>'product_id')),
            'city' => array(self::BELONGS_TO, 'City',  array('city_id'=>'city_id')),
        );

5 / 顺便说一句,忘记你如何使用 self::STAT 来尝试使东西正常工作,它只是为你提供 CityHasProduct 与 city_id 或 product_id 匹配的记录计数

统计查询

除了上述的关系查询,Yii 还支持所谓的统计查询(或聚合查询)。是指获取相关对象的聚合信息,例如每个帖子的评论数、每个产品的平均评分等。只能对HAS_MANY中相关的对象进行统计查询(例如一个帖子有很多评论)或 MANY_MANY(例如,一个帖子属于多个类别,一个类别有多个帖子)。

执行统计查询与我们之前描述的执行关系查询非常相似。我们首先需要在 CActiveRecord 的关系()方法中声明统计查询,就像我们在关系查询中所做的那样。

http://www.yiiframework.com/doc/guide/1.1/en/database.arr

*仍然有一些技巧可以帮助您克服困难。'pamount'您只需在 Product 上 添加更多公共属性名称,然后在 City 模型上创建一个函数function getProductWithAmount([index from default search $city->products]) 并继续它。

$amountFromProductIndex = $city->getProductWithAmount(0)->pamount;

但是,我不鼓励您遵循它。

于 2013-08-05T18:24:01.023 回答
-1
  1. 我觉得你们的关系有些问题。您说 City-Product 是多对多但您cityProducts模型中的关系是 aHAS_ONE而不是 a HAS_MANY。您的关系的另一个问题是您正在尝试使用统计查询从 CityHasProducts 获取标量值,但统计查询用于检索聚合值,如 COUNT(*) 或 SUM(amount)。
  2. 由于城市到产品是多对多的,因此给定产品没有单个城市,但是您可以获得给定产品的一系列城市。那个阵列可能只有一个城市,但它仍然是一个阵列。
  3. 您可以在给定城市和产品的情况下检索产品的金额,您可以从产品或城市中获取金额,您可以选择。

尝试这个:

$product = Product::model()->with('city_has_products')->findByAttributes(array(
    'condition' => 't.id = :city_id and cityHasProducts.poduct_id = :product_id',
    'params' = array(
        ':product_id' => $product_id,
        ':city_id' => $cty_id,
    ),
);
$amount = $product->city_has_products->amount;

您可能需要对其进行一些调整,因为它未经测试,但它应该为您提供一个方向。

于 2013-08-05T16:42:09.567 回答