2011-12-16 3 views
2

Я этоюй поиск на активных записей

$reviewModel=Review::model()->findAll(); 

Теперь я хочу, чтобы выполнить операцию поиска на $ reviewModel, скажем, я хочу искать, если пользователь ID 1 разместил отзыв или нет. так есть ли какая-либо функция, предоставляемая yii.

Примечание: Я не хочу использовать $ reviewModel = Обзор :: модель() -> FindAll (массив ('условие' => '')); Как мне необходимо все отзывы & затем выполнить поиск.

+1

$ reviewModel - это массив моделей. Или, что то же самое в Yii, массив массивов. Используйте свой предпочтительный алгоритм, чтобы найти нужные значения внутри многомерного массива. Легко. – Johnatan

ответ

0

Это то, что я бы рекомендовал и является хорошей практикой проектирования, а также позволит оптимальную производительность из вашей базы данных, + уменьшить количество запросов. Я бы сделал ваши отзывы связанными с пользователем. Как пользователь опубликует много отзывов. поэтому пользователь HAS_MANY просматривает. и Обзор и пользователь HAS_ONE. поэтому используйте это и создайте внешний ключ для построения отношений.

Так внутри вашей модели пользователя (отношения) ид есть что-то вроде этого:

'reviews' => array(self::HAS_MANY, 'Review', 'originator), 

Теперь внутри обзор модели идентификатору иметь что-то вроде этого:

'user' => array(self::BELONGS_TO, 'User', 'originator'), 

После того, как вы сделали все, что вы нужно было бы пропустить все просмотры пользователей. Если его нет, у них нет отзывов.

$user = User::model()->findbyPk(1); 

и пользователь-> обзоры будут содержать все отзывы для этого пользователя.

+0

Мой вопрос полностью отличается от вашего ответа. Повторяю, мне нужны все обзоры, а затем выполните операцию поиска на этом – iThink

0

Не знаю, что я знаю (если я правильно понимаю ваш вопрос). Yii предоставляет различные способы спросить, чего вы хотите от БД, но не из массива активных моделей записей в памяти.

Если вы хотите сделать это таким образом, то получите массив данных, как вы это делали, а затем используйте PHP для повторения массива моделей, ищущих то, что вы хотите.

0

Вы можете фильтровать их вручную. Например:

$reviewModel=Review::model()->findAll(); 

$matched = false; 
foreach($reviewModel as $r) //cycle through each review 
{ 
    if($r->user == 1)   //check if user is desired 
    { 
     $matched = true; //set matched as true 
     break;  //stop searching, as we already found one 
    } 
} 

Если вы хотите найти несколько вещей, вы можете использовать массив для согласования, а затем проверить этот массив.

$reviewModel=Review::model()->findAll(); 

$wanted = array(0=>false,3=>false,6=>false,8=>false); 

foreach($reviewModel as $r) //cycle through each review 
{ 
    if(isset($wanted[$r->user]) and !$wanted[$r->user]) //check if user is in wanted list and still false 
    { 
     $wanted[$r->user] == true; //set appropiate user to true 
    } 
} 
Смежные вопросы