PDA

View Full Version : عملیات CRUD با استفاده از کوئری بیلدرها در فریم ورک Yii



rezaonline.net
دوشنبه 27 آذر 1391, 03:30 صبح
کوئری بیلدر ها در 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']));

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


Insert
برای ساخت رکورد جدید


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
دوشنبه 27 آذر 1391, 10:05 صبح
با سلام


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


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

rezaonline.net
دوشنبه 27 آذر 1391, 13:30 عصر
خیر بصورت توکار اعمال میشود .
از کد نویسی با Yii لذت ببرید .

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

rezaonline.net
شنبه 14 بهمن 1391, 01:57 صبح
اما باید توجه داشت که روی عملکرد برنامه تاثیر داره ، زمانی که پردازش و سرعت اجرای برنامه اهمیت داشته باشد.
به علاوه امکان پیاده سازی SQL های پیچیده در این روش مشکل و در مواردی غیر ممکن می باشد.
منظورتون اینه استفاده از کوئری بیلدر ها ، اشتباست ؟

tux-world
دوشنبه 14 اسفند 1391, 20:16 عصر
سلام. اینکه میگید سرعت بالا میره . الان چقدر ارزش اینو داره که ما بیاییم سایت یا نرم افزار رو به این صورت بکار ببریم و از اکتیو رکورد استفاده نکنیم؟ ممکنه اکتیو رکورد به ارزشش بیرزه که ازش استفاده کنیم نه؟

shgn_java
یک شنبه 20 اسفند 1391, 16:42 عصر
سلام آقا رضا.
از این کوئری بیلدر کجا باید استفاده کرد؟
آخه کلاس های مدل اکثرا از ActiveRecord اکستند شده اند.

Pouyan2010
دوشنبه 21 اسفند 1391, 08:56 صبح
با سلام
قبل از شروع حرف هام بگم که هیچ منظوری نداشته و نظر شخصی خودم را بیان می کنم.
همانطور که در تاپیک آموزش شی گرایی (http://barnamenevis.org/showthread.php?378917-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%85%D8%A8%D8%A7%D8%AD%D8%AB-%D8%B4%DB%8C-%DA%AF%D8%B1%D8%A7%DB%8C%DB%8C-%D9%81%D8%B1%DB%8C%D9%85-%D9%88%D8%B1%DA%A9-Yii) yii نوشتم، ما در لایه ی مدل دو نوع فرم داریم یا فرم هایی که اطلاعات استاتیک رو می گیرند یا فرم های که از ActiveRecord اکستند شده اند که اطلاعات را با بانک اطلاعاتی تعامل می دهند، و هیچ ربطی به سرعت تبادل ندارد.
ببینید دوستان در جاهایی که ما نیاز به ساخت و اجرای query خاصی هستیم ما از query builder استفاده می کنیم اما جاهایی که wizard جوابگو هست نیازی به این کار نیست چرا؟ چون که فکر می کنید پشت همین کلاس ActiveRecord چه کد هایی نوشته شده است؟
من بازهم تاکید می کنم فریم ورک yii یک فریم ورک ایزوله شده هست. همه چیز تست شده است و امتحان خود را پس داده است تا license های مورد نظر را کسب کرده، نمی تواینم بگوییم کدام بهتر است یا کدام بدتر هر کدام کاربرد خاص خود را در جای مورد نظر خود دارد. query builder در جاهایی که دستورات sql پیچیده می شود کاربرد دارد نه اینکه جایگزین Active Record شود.
موفق و سربلند باشید

rezaonline.net
سه شنبه 22 اسفند 1391, 06:06 صبح
سلام. اینکه میگید سرعت بالا میره . الان چقدر ارزش اینو داره که ما بیاییم سایت یا نرم افزار رو به این صورت بکار ببریم و از اکتیو رکورد استفاده نکنیم؟ ممکنه اکتیو رکورد به ارزشش بیرزه که ازش استفاده کنیم نه؟
ابزارهای مشابه کارهای مشابهی انجام میدن ، بهتره با توجه به نوع نیاز از یکیشون یا همشون استفاده بشه .
من بیس کارهام از ActiveRecord استفاده میکنم اما مثلا برای وقتی که لازمه فیلد مبلغ از رکورد یوزر رو تغییر بدم ، به جای اینکه بیام یک بار find کنم و بعد save که جمعا میشه دو کوئری ، فقط یکبار از متد update کوئری بلیدر استفاده میکنم .
درسته الان میگید اینم update داره ولی بهرحال دیگه دیگه ...
یا جاهایی که نیاز هست تراکنش رو دیتابیس باشه من از کوئری بیلدر استفاده میکنم .


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


همانطور که در تاپیک آموزش شی گرایی (http://barnamenevis.org/showthread.php?378917-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%85%D8%A8%D8%A7%D8%AD%D8%AB-%D8%B4%DB%8C-%DA%AF%D8%B1%D8%A7%DB%8C%DB%8C-%D9%81%D8%B1%DB%8C%D9%85-%D9%88%D8%B1%DA%A9-Yii) yii نوشتم، ما در لایه ی مدل دو نوع فرم داریم یا فرم هایی که اطلاعات استاتیک رو می گیرند یا فرم های که از ActiveRecord اکستند شده اند که اطلاعات را با بانک اطلاعاتی تعامل می دهند، و هیچ ربطی به سرعت تبادل ندارد.
دوست عزیز ، اکتیو رکورد Yii ، حجم اطلاعات بیشتری رو تبادل میکنه ، برای مثال یک آپدید ساده نیازمند واکشی تمامی فیلد ها و ذخیره سازی دوباره تمامی فیلدها میشه اما در کوئری بیلدر متد آپدید فقط اون فیلد تغییر میکنه ، پس سریعتره .
درسته میشه با کمی کدنویسی بیشتر اکتیو رکورد رو هم به همین شکل پیاده کرد اما کوئری بیلدر Yii هم به درد بخوره ، پس زیاد دنبال مقایسه این دو تا نگردید .
در آخر با این جملتون موافقم

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