2013-08-05 1 views
0

Так что я хочу делать с yii - это небольшой комплекс.

База данных
У меня есть город, city_has_product и таблица продуктов. Таким образом, город MANY_TO_MANY с продуктами через city_has_product. И city_has_product имеет столбец с именем amount.Yii: Получить значение из столбца соединительной таблицы MANY_TO_MANY в другой таблице на уровне модели

Для зная FK и PK имена, здесь таблицы с FK и первичные ключи:

город
ID

city_has_product
CITY_ID
PRODUCT_ID

продукт
идентификатор


То, что я хочу, как модель
Я хочу, что я могу сделать это: $> Продукция города-[0] -> сумма
Таким образом, значение суммы происходит от city_has_product к продукту (в уровневая модель)

до сих пор я
Город имеет это отношения:

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'), 
); 

CityHasProdu КТС имеет никакого отношения Продукт не имеет отношения это:

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', но это не сработало. Я не знаю, как я могу получить доступ к city.id от Product, потому что у меня нет прямого отношения к городу, потому что на уровне продукта и городе уровень MANY_TO_MANY.

Вопросы
1. Возможно ли это как отношение к yii?
2. Как я могу получить city.id от продукта?
3. Я нахожусь на правильном пути? Если не так, как добраться до этой модели, я хочу?

Спасибо за все ваши ответы :)

ответ

-1
  1. Я думаю, что ваши отношения имеют некоторые проблемы. Вы говорите, что City - продукт много для многих, но ваше отношение city в модели Products является HAS_ONE вместо HAS_MANY. и другая проблема с вашими отношениями заключается в том, что вы пытаетесь использовать статистический запрос для получения скалярного значения из CityHasProducts, но статистические запросы - для получения совокупных значений, таких как COUNT (*) или SUM (сумма).
  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; 

Вы, возможно, придется настроить это немного, как это проверялось, но он должен обеспечить направление для вас.

+0

согласен ли я с некоторыми пунктами в вашем аргументе, но то, что вы показали, является обратным. Поскольку ваш код не тестировался, я игнорирую вашу опечатку, но все равно было ошибкой. Вы даже не можете передать условие через findByAttributes, как это, кстати, как вы могли позволить $ product-> city_has_products получить доступ к свойству суммы, поскольку он по сути был массивом? –

+0

Я получил это с веб-сайта Yii здесь: http://www.yiiframework.com/forum/index.php/topic/21178-findbyattributes-example/ – jmarkmurphy

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_id и product_id, вы никогда не получите двух объектов City и Product.

2/Хорошо, нам нужны два city_id и product_id, но как вы проходите и заставляете их работать вместе, чтобы получить сумму от category_has_product? Это похоже на следующий снайпер?

$ Город-> продукты [0] -> сумма

Ой, мы получили проблему сейчас, это было неправильно точно. Не думайте, что вы получили city_id (от $city) и product_id (от $product по индексу 0), тогда amount должно было быть получено от Product. Нет, нет. Мы оба знали, что колонка amount была в CityHasProduct моделью, а не City или Product, а затем amount не было товара или городского имущества абсолютно.

3/У вас было отношение к Сити и Продукту, но как они подходят для вашей цели. Давайте посмотрим следующий запрос:

$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/Btw, забыть способ, как использовать само :: STAT, чтобы попытаться сделать вещи работать, он просто дает подсчет записей из матча CityHasProduct с CITY_ID или product_id

Статистический запрос

Помимо реляционных запросов, описанных выше, Yii также поддерживает так называемые статистические запросы (или запросы агрегирования). Он ссылается на на получение агрегирующей информации о связанных объектах, , например, количество комментариев для каждого сообщения, средний рейтинг для каждого продукта и т. Д. Статистический запрос может быть выполнен только для объектов , связанных с HAS_MANY (например, сообщение имеет много комментариев) или MANY_MANY (например, сообщение относится ко многим категориям, а в категории есть много сообщений).

Выполнение статистического запроса очень похоже на выполняемое отношение запрос, как мы описали ранее. Сначала нам нужно объявить статистический запрос в методе отношений() CActiveRecord, как и в случае с реляционным запросом .

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

* Там еще есть некоторые уловки, чтобы помочь вам, чтобы получить более. Вы просто добавите еще одно публичное название собственности 'pamount' на Продукт, затем вы создаете функцию на модели города function getProductWithAmount([index from default search $city->products]) и продолжайте ее.

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

Однако я не рекомендую вам следовать за ним.