# زبان های اسکریپتی > PHP > Yii Framework >  عملیات CRUD با استفاده از کوئری بیلدرها در فریم ورک Yii

## rezaonline.net

کوئری بیلدر ها در Yii
 چنانچه نخواید از Active record فریم ورک Yii استفاده کنید ، کوئری بیلدرها به کارتون میاد .
 استفاده از این شیوه سرعت کدنویسی شما رو پایین می‌آورد ولی در نهایت سرعت اجرای برنامه بیشتر خواهد بود .

*دستورSELECT*


Yii::app()->db->createCommand()
 	->select('*')
 	->from('tbl')
 	->where('id=:id',array(':id'=>$_GET['id']))
 	->queryAll();
 
همه چیز واضح هست فقط چنانچه نیاز داشتید چند ستون دلخواه را واکشی کنید توی متد select اونها رو بنویسید بصورت
select('id , title , content')
 نحوه استفاده از where هم کاملاً معلوم هست .(مثل PDO)
 اما انواع مختلفش رو از کتاب Yii Guide
// WHERE id=1 or id=2 
 where(’id=1 or id=2’) 
 

 // WHERE id=:id1 or id=:id2 
 where(’id=:id1 or id=:id2’, array(’:id1’=>1, ’:id2’=>2)) 
 

 // WHERE id=1 OR id=2 
 where(array(’or’, ’id=1’, ’id=2’)) 
 

 // WHERE id=1 AND (type=2 OR type=3) 
 where(array(’and’, ’id=1’, array(’or’, ’type=2’, ’type=3’))) 
 

 // WHERE ‘id‘ IN (1, 2) 
 where(array(’in’, ’id’, array(1, 2)) 
 

 // WHERE ‘id‘ NOT IN (1, 2) 
 where(array(’not in’, ’id’, array(1,2))) 
 

 // WHERE ‘name‘ LIKE ’%Qiang%’ 
 where(array(’like’, ’name’, ’%Qiang%’)) 
 

 // WHERE ‘name‘ LIKE ’%Qiang’ AND ‘name‘ LIKE ’%Xue’ 
 where(array(’like’, ’name’, array(’%Qiang’, ’%Xue’))) 
 

 // WHERE ‘name‘ LIKE ’%Qiang’ OR ‘name‘ LIKE ’%Xue’ 
 where(array(’or like’, ’name’, array(’%Qiang’, ’%Xue’))) 
 

 // WHERE ‘name‘ NOT LIKE ’%Qiang%’ 
 where(array(’not like’, ’name’, ’%Qiang%’)) 
 

 // WHERE ‘name‘ NOT LIKE ’%Qiang%’ OR ‘name‘ NOT LIKE ’%Xue%’ 
 where(array(’or not like’, ’name’, array(’%Qiang%’, ’%Xue%’))) 
 
برای واکشی اطلاعات نهایی میتوانید از متد queryAll استفاده کنید چنانچه نیاز به واکشی یک سطر داشتید از متد queryRow استفاده کنید .
 چنانچه نیاز داشتید فقط اولین مقدار اولین ستون رو واکشی کنید از queryScalar استفاده کنید
 یک مثال :

 $count = Yii::app()->db->createCommand()
 	->select('count(id)')
 	->from('post')
 	->queryScalar();
 

*update*
*برای آپدیت کردن یک سطر از متد update استفاده می‌شود .*
 مثال

 $rowAffected = Yii::app()->db->createCommand()
 	->update('post',array(
 			'title'=> $_POST['title'] ,
 			'content'=>$_POST['content'] ,
 				),'id=:id',array(':id'=>$_POST['id']));

مقدار بازگشتی تعداد رکوردهای تغییر کرده هست .


I*nsert*
*برای ساخت رکورد جدید*
 
 Yii::app()->db->createCommand()
 	->insert('post' , array(
 			'title'=>$_POST['title'] ,
 			'content'=>$_POST['content'],
 ));
 
*delete*
*برای حذف رکورد*
 مقدار بازگشتی تعداد رکوردهای تغییر کرده

 Yii::app()->db->createCommand()
 	->delete('post','id=:id',array(':id'=>$_POST['id']));
 

مقدمه‌ای کوتاه بود تا بتونید عملیاتCRUD رو روی دیتابیس با استفاده از کوئری بیلدر فریم ورک Yii انجام بدید .


 پ ن : کدها رو سریع نوشتم تست کنید اگه مشکلی داشت بگید .
 انشاالله جلسات بعد مطالب پر بارتر

----------


## mohsen_31369

با سلام



> Yii::app()->db->createCommand()
>    ->delete('post','id=:id',array(':id'=>$_POST['id']));


آیا در این قسمت نیاز به escape کردن ورودی نداریم؟

----------


## rezaonline.net

خیر بصورت توکار اعمال میشود .
از کد نویسی با Yii لذت ببرید .

----------


## afshin9032

کار رو راحت می کنه و برنامه از نظر نوع پایگاه داده مشکل خاصی ندارد .
اما باید توجه داشت که روی عملکرد برنامه تاثیر داره ، زمانی که پردازش و سرعت اجرای برنامه اهمیت داشته باشد.
به علاوه امکان پیاده سازی SQL های پیچیده در این روش مشکل و در مواردی غیر ممکن می باشد.

----------


## rezaonline.net

> اما باید توجه داشت که روی عملکرد برنامه تاثیر داره ، زمانی که پردازش و سرعت اجرای برنامه اهمیت داشته باشد.
> به علاوه امکان پیاده سازی SQL های پیچیده در این روش مشکل و در مواردی غیر ممکن می باشد.


منظورتون اینه استفاده از کوئری بیلدر ها ، اشتباست ؟

----------


## tux-world

سلام. اینکه میگید سرعت بالا میره . الان چقدر ارزش اینو داره که ما بیاییم سایت یا نرم افزار رو به این صورت بکار ببریم و از اکتیو رکورد استفاده نکنیم؟ ممکنه اکتیو رکورد به ارزشش بیرزه که ازش استفاده کنیم نه؟

----------


## shgn_java

سلام آقا رضا.
از این کوئری بیلدر کجا باید استفاده کرد؟
آخه کلاس های مدل اکثرا از ActiveRecord اکستند شده اند.

----------


## Pouyan2010

با سلام
قبل از شروع حرف هام  بگم که هیچ منظوری نداشته و نظر شخصی خودم را بیان می کنم.
همانطور که در تاپیک آموزش شی گرایی yii نوشتم، ما در لایه ی مدل دو نوع فرم داریم یا فرم هایی که اطلاعات استاتیک رو می گیرند یا فرم های که از ActiveRecord  اکستند شده اند که اطلاعات را با بانک اطلاعاتی تعامل می دهند، و هیچ ربطی به سرعت تبادل ندارد.
ببینید دوستان در جاهایی که ما نیاز به ساخت و اجرای query خاصی هستیم ما از query builder استفاده می کنیم اما جاهایی که wizard جوابگو هست نیازی به این کار نیست چرا؟ چون که فکر می کنید پشت همین کلاس ActiveRecord چه کد هایی نوشته شده است؟
من بازهم تاکید می کنم فریم ورک yii یک فریم ورک ایزوله شده هست. همه چیز تست شده است و امتحان خود را پس داده است تا license های مورد نظر را کسب کرده، نمی تواینم بگوییم کدام بهتر است یا کدام بدتر هر کدام کاربرد خاص خود را در جای مورد نظر خود دارد. query builder در جاهایی که دستورات sql پیچیده می شود کاربرد دارد نه اینکه جایگزین Active Record شود.
موفق و سربلند باشید

----------


## rezaonline.net

> سلام. اینکه میگید سرعت بالا میره . الان چقدر ارزش اینو داره که ما بیاییم  سایت یا نرم افزار رو به این صورت بکار ببریم و از اکتیو رکورد استفاده  نکنیم؟ ممکنه اکتیو رکورد به ارزشش بیرزه که ازش استفاده کنیم نه؟


ابزارهای مشابه کارهای مشابهی انجام میدن ، بهتره با توجه به نوع نیاز از یکیشون یا همشون استفاده بشه .
من بیس کارهام از ActiveRecord استفاده میکنم اما مثلا برای وقتی که لازمه فیلد مبلغ از رکورد یوزر رو تغییر بدم ، به جای اینکه بیام یک بار find کنم و بعد save که جمعا میشه دو کوئری ، فقط یکبار از متد update کوئری بلیدر استفاده میکنم .
درسته الان میگید اینم update داره ولی بهرحال دیگه دیگه ...
یا جاهایی که نیاز هست تراکنش رو دیتابیس باشه من از کوئری بیلدر استفاده میکنم .




> سلام آقا رضا.
> از این کوئری بیلدر کجا باید استفاده کرد؟
> آخه کلاس های مدل اکثرا از ActiveRecord اکستند شده اند.


همه جا میشه استفاده کرد .




> همانطور که در تاپیک آموزش شی گرایی  yii نوشتم، ما در لایه ی مدل دو نوع فرم داریم یا فرم هایی که اطلاعات  استاتیک رو می گیرند یا فرم های که از ActiveRecord  اکستند شده اند که  اطلاعات را با بانک اطلاعاتی تعامل می دهند، و هیچ ربطی به سرعت تبادل  ندارد.


دوست عزیز ، اکتیو رکورد Yii ، حجم اطلاعات بیشتری رو تبادل میکنه ، برای مثال یک آپدید ساده نیازمند واکشی تمامی فیلد ها و ذخیره سازی دوباره تمامی فیلدها میشه اما در کوئری بیلدر متد آپدید فقط اون فیلد تغییر میکنه ، پس سریعتره .
درسته میشه با کمی کدنویسی بیشتر اکتیو رکورد رو هم به همین شکل پیاده کرد اما کوئری بیلدر Yii هم به درد بخوره ، پس زیاد دنبال مقایسه این دو تا نگردید .
در آخر با این جملتون موافقم



> نمی تواینم بگوییم کدام بهتر است یا کدام بدتر هر کدام کاربرد خاص خود را  در جای مورد نظر خود دارد. query builder در جاهایی که دستورات sql پیچیده  می شود کاربرد دارد نه اینکه جایگزین Active Record شود.

----------

