تغییر اندیس آرایه هنگام کوئری

[rtl][font="Tahoma"]

سلام دوستان

من این کوئری رو دارم:

[/font][/rtl]


$query = new Query;

      $query->select('*')->from('item')->where("id IN ($items_id)");

      $result = $query->all();



[rtl][font="Tahoma"]

تو حالت پیش فرض اندیس های آرایه اعداد صفر و یک و … هستن

می تونه طوری باشه که اندیس ها id های توی تیبل item باشن؟

[/font][/rtl]

[rtl]والا من یکی که نفهمیدم منظورتو :expressionless:

یعنی چی اندیس ها Id های توی جدول Item باشن ؟[/rtl]

[right]سلام

منظورت کدوم آرایه هست؟

میشه بیشتر توضیح بدی که دقیقا هدفت چی هست؟[/right]

[font="Tahoma"][rtl]

سلام. احتمالا منظورشون آرایه result هست…با این پیش فرض، خب یک تابع بنویس که اندیس ها رو تغییر بده به id جدول item! بعید میدونم بشه تعیین کرد اندیس با فیلد دیتابیس پر شه[/rtl][/font]

[rtl][font="Tahoma"]

منظورم همين چيزي هست كه hesam ميگه

خوب همچين كار كردم

نمي خوام ديگه توي جواب هي بچرخم، يه موقع اي هست كه يه آرايه بزرگ مي ده و چند بار هم به بدست اوردن اين جواب نيازه

خواستم اين قسمتشو بي واسطه انجام بدم

[/font][/rtl]

[rtl]

من نمیدونم فریمورک راه حلی واسه این کار داره یا نه

ولی به هر حال اگه این چرخیدن توی جواب رو شما انجام ندی فریمورک می‌خواد انجام بده دیگه

در واقع فکر نکنم تاثیر زیادی روی سربار برنامه داشته باشه

[/rtl]

[rtl][font="Tahoma"]

يه كم فكر كنيم اگه همچين راه حلي وجود داشت شايد فريم ورك نخواد دونه به دونه بچرخه

مي تونه موقع اضافه كردم هر مقدار آرايه، همزمان مقدار انديس اون هم كه اينجا همون مقدار id هست رو قرار بده

[/font][/rtl]

[font="Tahoma"][rtl]راجع به اینکه چند بار میخواهید یک آرایه بزرگ رو از دیتابیس بخونید و هربار روش چرخش انجام بدید، برای این میشه از یک کش ساده استفاده کرد. کد زیر رو ببینید:

[/rtl][/font]




        private _somethingFromDB;


	public function getSomethingFromDB()

	{

		if (!isset($this->_somethingFromDB)) {

			$rawDataFromDb = Class::model()->findAll($someCriteria);

                        $this->_somethingFromDB = Iterator::iterate($rawDataFromDb);


		}


		return $this->_somethingFromDB;

	}



[font="Tahoma"][rtl]با روش بالا، اگر چندین بار هم در یک پروسه نیاز داشته باشید که از دیتابیس اون اطلاعات خاص رو بخونید، فقط بار اول کوئری زده میشه و دفعات بعد از همون اطلاعات اول استفاده مجدد میشه. ضمنا در عمل چرخش هم صرفه جویی شده و فقط یکبار انجام شده

منتها اکر بخواهید بین درخواست های متفاوت این اطلاعات قابل استفاده مجدد باشه دیگه باید از caching پیشرفته تری استفاده کنید که خود Yii خیلی خوب در اختیار میگذاره

چیزی شبیه به این:[/rtl][/font]




        private _somethingFromDB;


	public function getSomethingFromDB()

	{

		if (!isset($this->_somethingFromDB)) {

			$rawDataFromDb = Class::model()->findAll($someCriteria);

                        $this->_somethingFromDB = Iterator::iterate($rawDataFromDb);

                        Yii::app()->cache->set('uniqueCacheId',$this->_somethingFromDB); // permanent cache

		}


		return $this->_somethingFromDB;

	}



[rtl][font=“Tahoma”]پ.ن: کد دوم که از کش فرمورک استفاده میکنه فقط جنبه مفهومی داره وگرنه با اینکه کش داره ست میشه ولی جایی چک نمیشه که بعدا از کش بخواد بازیابی شه! آقا عماد لطف کرد نسخه کاملش رو نوشت ::) [/font][/rtl]

[rtl]

یه خورده کد حسام رو دستکاری میکنم

اینطوری بهتره…[/rtl]

[size="2"]




private _somethingFromDB = null;


public function getSomethingFromDB()

{

	if ($this->_somethingFromDB !== null) 

		return $this->_somethingFromDB;

		

	if(($this->_somethingFromDB = Yii::app->cache->get("uniqueCacheId")) !== false)

		return $this->_somethingFromDB;


	$rawDataFromDb = Class::model()->findAll($someCriteria);

	$this->_somethingFromDB = Iterator::iterate($rawDataFromDb);

	Yii::app()->cache->set('uniqueCacheId',$this->_somethingFromDB); // permanent cache


	return $this->_somethingFromDB;

}



[/size]


// Path: protected/components/Tools.php

class Tools

{

    public static function MakeAssoc($models) {

        $result = array();

        foreach($models as $model) {

            $keys = array_keys($model->attributeLabels());

            $pk = array_shift($keys);

            $row = array();

            foreach($keys as $key) {

                $row[$key] = $model->{$key};

            }

            $result[$pk] = $row;

        }

        return $result;

    }

}




// usage:

$users = Tools::MakeAssoc(Users::model()->findAll('confirmed=1'));




$query = new Query();

$query->select('*')->from('item')->indexBy('id');

$query = $query->all();