آموزش RedBeanORM (PHP ORM) پارت دوم

خب ، توی مقاله قبلی (یعنی این مقاله) یک سری مقدمات درباره RedBean گفتیم. حالا اینجا می خوایم عملیات های crud رو پیاده سازی کنیم که نیاز اکثر اپلیکیشن ها هستن.قبل شروع کردن بحث خوبه که بگم که RedBean از یک ساختاری بنام Beans برای کارهاش استفاده میکنه. اکثر کنش هاش بر روی دیتابیس توسط همین bean ها اتفاق می افته و مورد استفادشون برای حمل داده بین ما و بین دیتابیس هست.هر Bean یک type و یک id داره.type برای ما مشخص میکنه که داریم روی چه جدولی تغییرات اعمال میکنیم. id هم primary key رکورد متناظر خودش توی دیتابیس هست.خب پس توی ادامه مقاله سعی میکنیم با ادبیات خود RedBean با هم صحبت کنیم.توضیحات این بخش در مقاله قبلی آمدهخب میبینیم که یک bean ایجاد کردیم تحت عنوان post و ستون براش ایجاد کردیم.حالا میخوایم یک سری نکته جدید یاد بگیریم. RedBean برای ما فقط ساختار داده ضروری مورد نیازمون رو ایجاد میکنه و اصلا کاری با index ها و constraint ها نداره و اگر قصد داشته باشیم این موارد رو اضافه کنیم ، باید بصورت دستی به دیتابیس اضافه کنیم.خب نکته بعدی توی نام گذاری اسم Bean ها هست . اسم Bean ها اجبارا باید تشکیل شده از حروف کوچک الفبا باشه و حق استفاده از حروف بزرگ ، _ و علائم رو نداریم.نام گذاری خاص فقط مرتبط با اسم Bean نیست بلکه روی ایجاد ستون ها هم تاثیر گذاره. بطور مثال ما حق نداریم ستونی داشته باشیم که در انتهای نام اون ستون ، id_ آمده باشه چون این مورد برای RedBean رزرو شده هست (دلیل رزرو شدنش استفاده از این نحوه نوشتن نام برای relation هاست).یا اگر ما نام ستون هارو بصورت camel case بنویسیم (بطور مثال : areYouSure) بصورت خودکار به snake case تبدیلش میکنه(یعنی تبدیل میشه به are_you_sure).خب بریم سراغ مرحله بعد یعنی load داده از دیتابیس .این مورد رو هم توی مقاله قبلی دیدیم ولی الان میخوایم با جزئیات بیشتری بهش نگاه کنیم.توضیحات این تصویر در مقاله قبلی آمده استخب ما داریم تلاش میکنیم که از Bean با نام post ، یک ردیف با id 1 رو بخونیم.حالا اگر همچین Bean ای وجود نداشته باشه (فرضا اشتباه تایپی داشتیم توی نوشتن نام Bean ) چه اتفاقی می افته؟ در پاسخ به پرسش بالا باید بگم که یک Bean خالی برگشت داده میشه که فیلد id داره و مقدار این فیلد برابر 0 هست. البته صفر بودنش دو معنی میتونه داشته باشه : 1-ردیفی با همچین id ای موجود نیست2- همچین bean ای در دیتابیس موجود نیستخب نکته بعدی اینه که RedBean بطور پیشفرض فقط string برمیگردونه از دیتابیس (هر چیزی رو تبدیل میکنه به string و برمیگردونه ) و اگر به هر دلیلی قصد تغییر این رفتار رو داشته باشیم ، می تونیم از کد زیر استفاده کنیم.R::getDatabaseAdapter()->getDatabase()->getPDO()->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);در زیر ساخت RedBean داره از PDO استفاده میکنه.PDO مخفف php data object هست که یک ابزار برای ارتباط با دیتابیس هست ولی عمل mapping و توابع آماده برای query های پیش فرض رو نداره (برخلاف ORM ها).خب بریم سراغ ادامه مطلب.ما گاهی دیتا رو از دیتابیس میخونیم و فقط قصدمون display کردن اون دیتا به کاربر هست ولی برخی موارد هم قصد ویرایش داریم بر روی اون دیتا. RedBean این قابلیت رو به ما میده که بتونیم رکورد مروبطه رو lock کنیم که شخص دگ ای نتونه کاری با اون انجام بده تا زمانی که ما کارمون (یا اصطلاحا transaction مون) تموم بشه و بعد اون رکورد از lock در میاد. برای استفاده از این مورد بجای فراخوانی Load عادی ، از تابع loadForUpdate استفاده میکنیم (این مورد برای ورژن 5 به بالا اومده و اگر از قبل این ورژن استفاده میکنید دسترسی به این امکان رو ندارید).علاوه بر خوندن یک bean از دیتابیس با تابع load ، ما میتونیم چندین bean رو هم بخونیم و این کار توسط تابع LoadAll اتفاق میافته.خب loadAll یک آرایه از id ها میگیره و به ما یک آرایه از Bean ها برمیگردونه و بعدش با یک حلقه foreach چاپشون رو انجام دادم تا مشخص بشه که درست کار کرده که در تصویر زیر میبینید.خب حالا بریم سراغ مبحث بعدی یعنی update کردن دیتا درون دیتابیس . قبل از شروع باید بگم که با RedBean هم میتونید دیتای درون دیتابیس رو آپدیت کنید و هم میتونید ساختار Beanرو آپدیت کنید(بطور مثال ستونی بهش اضافه کنید).اگر خاطرتون باشه ما یک bean توی مقاله قبلی تحت عنوان post ایجاد کردیم و دو ستون author_ و title_ داشت. حالا قصد دارم اینجا یک ستون اضافه کنم تحت عنوان date_ و مقدار title یکی از سطر هارو هم تغییر بدم.خب خیلی از کد هایی که بالا میبییند رو توی مراحل قبلی توضیح دادیم و ازشون میگذرم. بطور کلی در ابتدا row مربوطه که قصد داریم title اون رو تغییر بدیم رو از دیتابیس میخونیم. حالا ما هیچ ستونی تحت عنوان date_ توی دیتابیس نداریم و فقط کافیه مثل بالا ، شی آمده از دیتابیس رو براش یک فیلد تحت عنوان مد نظرمون قرار بدیم که این باعث میشه که بعد از store کردن یک ستون با اون نام برامون ایجاد بشه.حالا قصد داریم داخلش هم مقدار قرار بگیره و null نباشه مقدارش . برای این مورد میتونیم از خود RedBean برای دریافت زمان فعلی سیستم استفاده کنیم که کدش در تصویر قابل مشاهده است.برای تغییر مقدار یک ستون دگ از ردیف واکشی شده از دیتابیس هم فقط کافیه مثل بالا مقدار مد نظرمون رو بهش تخصیص بدیم.بطور کلی فرقی بین زمانی که میخوایم یک ستون جدید بسازیم یا یک مقدار تخصیص بدیم از سمت ما نیست و در پشت صحنه خود RedBean چک میکنه که آیا همچین ستونی وجود داره یا ن و اگر وجود داشت که خب مقدار رو آپدیت میکنه و اگر نبود، اون ستون رو ایجاد میکنه برای جدول.خب تغییرات مربوطه اعمال شدن. فقط یک نکته وجود داره اونم اینه که ستون date_ مقدارش برای بقیه رکورد ها null قرار میگیره .خب حالا بریم سراغ delete کردن اطلاعات از دیتابیس. برای حذف اطلاعات از دیتابیس ما میتونیم هم بصورت تکی این کار رو انجام بدیم هم بصورت جمعی.تابع trash که یک ورودی میگیره که bean ما هست و اون رو از دیتابیس حذف میکنه.تابع trashAll که یک آرایه ای از Bean ها میگیره و همه اون هارو حذف میکنه.همچنین ما میتونیم تمام Bean هایی که از یک نوع هستند رو هم همزمان حذف کنیم که این کار توسط تابع wipe انجام میشه و یک ورودی میگیره و ورودی اون ، type bean هست که قصد داریم تمام bean هاش حذف بشه.