توسعه و مدیریت دیتابیس

[rtl]سلام. سوالی که از دیروز دهنم رو مشغول کرده اینه که فرض میکنیم یه دیتابیس داریم که توش شماره تلفن ها رو به همراه کانتکت کامل ذخیره میکنیم. حالا بعدا یادمون می افته که ما آدرس لحاظ نکردیم برای ذخیره و تو دیتابیس هم معرفی نکردید. حالا که از ابزار GII استفاده کردیم و همه چی ساختیم درست کار میکنه ؛ بخواییم بعد این که این فیلد رو اضافه کردیم چطوری میتونیم تو برنامه بگونجونیمش. اینکه میدونم میتونیم تو فرم یه فیلد دیگه تعریف میکنیم. تو مدل چیکار کنیم؟ آیا اگه دوباره از GII استفاده کنیم اون مواردی که نوشتیم از بین میره و باید ازاول شروع کنیم به کد زدن؟[/rtl]

[right]

توی مدل باید به تابع

rules

این فیلد رو اضافه کنی

و همینطور به تابع

attributeLabels

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

search

هم اضافه کنید

البته برای حل ریشه ایه این مشکل یه راه خیلی قشنگ هست که اینجا فرصت مطرح کردنش نیست . اگه علاقمند بودی بهم بگو تا برات توضیح بدم

[/right]

[rtl]سلام. ممنون میشم که اون راه حل رو توضیح بدی.[/rtl]

[rtl]

بابا دوست عزیز این چه حرکتیه. لطفا توضیح بدید دیگه…

[/rtl]

[right]

سلام

ببخشید من نبودم

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

داخل پوشه مدل ها یک پوشه جدید بسازید با نام

base

فرض کنید یه جدول داریم به نام

tbl_post

که می خوایم از روش مدل بسازیم، مدل رو که ساختید یه کپی ازش بگیرید و تغییر نام بدهید(هم اسم فایل و هم اسم کلاس داخل فایل) و با نام

PostBase

در داخل پوشه بیس قرار دهید .حالا فایل اصلی پست را باز کرده و به جای اینکه آن را از اکتیورکورد اکتند کنید آن را از

PostBase

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

[left]

class Post extends PostBase

{

/**


 * Returns the static model of the specified AR class.


 * @return Product the static model class


 */


public static function model($className=__CLASS__)


{


	return parent::model($className);


}	

}

[/left]

از این به بعد شما به

PostBase

کاری نخواهید داشت و تمام توابع خود را در مدل پست بنویسید و اگر نیاز داشتید می توانید توابع موجود در بیس را در این مدل با همان نام ها باز نویسی کنید

با این کار شما هر زمان به جدول هایتان چیزی اضافه کنید دیگر نیازی نیست نگران تداخلش با کدهای قبلی باشید خیلی راحت آن مدل را با

gii

تولید کنید و فایل تولید شده را پس از تغییر نام به جای فایلی که در پوشه بیس قرار دارد بگذارید .

فقط یادتان باشد که در بخش کانفیگ فایل

main.php

در بخش

import

جایی که مدل ها را صدا می زنیم مدل های داخل پوشه بیس را هم صدا بزنید مانند :

[left]

‘import’=>array(

	'application.models.base.*',


	'application.models.*',

[/left]

[/right]

[rtl]راه حل خیلی خوبیه.

اما یه سوال. یه جورایی توی برنامه تعداد فایلها خیلی زیاد نمی شوند؟

مدیریتشون خیلی سخت نمیشه؟

کما که توی این حالت هم اعمال تغییرات ممکنه سخت باشه.

غیر از این هم راه دیگری وجود دارد؟

[/rtl]

[rtl]اگه نشه به راحتی دیتابیس رو رو تغییرات انجام داد واقعا دردسریه برای خوش. تو حالت کلاسیک خودش زهرمار میکنه ساعات آدمو چه برسه به اینکه رو فریم ورک انجام بدی. ولی راه حل اصلا خوبی نبود این مورد. و همیچ وقت هم نمیشه دیتابیس رو واقعا بدون اشکال ساخت اگر هم باشه بعدها تو توسعه به مشکل بر میخوریم[/rtl]

[rtl]چرا اتفاقا خیلیه راه خوبیه.

اینطوری دیگه با هر تغییر در دیتابیس نیاز به تغییر در کل کلاسها نیست. کلاس های ساخته شده با gii که جای دیگه هستند و شما روی کلاسهایی تغییرات را اعمال می کنید که خودتان ایجاد کرده اید.

[/rtl]

[rtl]شاید خوب باشه. توسعه و نگهداری بیشترین هزینه رو از لحاظ وقت و بقیه موارد رو به خودش اختصاص میده.[/rtl]

[right]

سلام

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

در مورد اینکه فایل ها زیاد میشن باید بگم ایرادی نداره و من الان تو یکی از ماژول هام حدود ۶۰ تا مدل دارم که با این روش دارم باهاشون کار می کنم . البته این روش بسته به نوع سیستم شما خیلی مزایای دیگه هم در اختیارتون میگذاره که توضیحش بسیار مفصله و باید یه بار سر فرصت براتون بنویسم

مدیریتشون هم سخت نیست ، چون عملا شما به فایل های بیس کاری ندارید و فقط روی یک فایل کد میزنید

تغییرات اگه افزایشی باشه روی مدل این سیستم تقریبا بدون مشکل خواهد بود اما اگه کاهشی و یا تغییر نام باشد در هر صورت شما باید تو کل سیستم ، نه تنها مدل تغییرات رو اعمال کنید

[/right]

[font="Tahoma"] [rtl]روش جناب mereeelin روش خوبیه من با این روش برخورد داشتم.

اما راه دیگه اینکه شما اصلاً توابع اصلیتون رو توی مدل ننویسید (راستش اصلاً جاشم اونجا نیست! این فریم ورک رفیق نابابه!!!) :D

مدل رو همینطوری خام میزارید بمونه، حالا با همین GII شما با هر بار تغییر بازنویسیش کنید.

بعد یه شاخه مثلاً به اسم services در protected بسازید و همه کلاسهای منطق برنامتون رو اونجا بزارید. مثلاً به ازای هر مدل یه service درست کنید و توابعی که قبلاً توی مدل مینوشتید رو توی کلاس هم نام مدلتون بنویسید. لزومی هم نداره کلاسهای service از جایی اکستند بشن. یعنی اینطوری:

[/rtl]




|

|--Protected

|----Models

|------User.php

|----Services

|------UserService.php



[rtl]

بعد هم که مشخصه چطوری از توابعتون استفاده کنید:

[/rtl]




$service = new UserService();

$model = $service->getBestUser();

$service->setBestUser($model);



[rtl]

حتی میتونید یه شاخه Repository داشته باشید که کلاسهای کار با دیتابیس و کوئری ها رو اونجا بنویسید و اینطور طبقه بندی کدهاتون بهتر میشه.

این یکی از اصول پایه ای مباحث Design Pattern است.

[/rtl] [/font]

[rtl]اگه ممکنه درباره این services بیشتر توضیح بدید.

در ضمن این روشی که شما گفتید برای اعمال متدهایی است که می خواهیم بعدا به مدلها اضافه کنیم.

ولی سوال اینجاست که ما مدل را با Gii زدیم ولی حالا می خواهیم یک یا چند فیلد را حذف یا اضافه کنیم، چه باید کرد؟

[/rtl]

[/left][/right] [rtl]

بنده امتحان کردم همین یه متد هم لازم نبود. بدون آن هم کار می کرد.

دلیل خاصی داره که توی این کلاس هم قرارش می دید؟

[/rtl]

[rtl][font="Tahoma"]Service جاییه که منطق برنامه درش اتفاق میافته. یک سری کلاس و متد هستند که در هر کجای برنامه قابل دسترس هستند.

عمده استفاده اونها در لایه Controller هست.

اینکار باعث جداسازی منطق برنامه از Platform و مدلهای شما میشه، یعنی مثلاً اگر فردا خواستید برای پلت فرم دیگری مثلاً برای موبایل کد بنویسید ساده تر اینکارو انجام بدید.

فکر میکنم مشکل همین بود که وقتی با GII مدل جدید ایجاد میکنیم فایل Model بازنویسی میشه و توابعی که توی اون بود از بین میرن که بنده هم عرض کردم اون توابع رو میتونید از توی مدل در بیارید و توی کلاسهای دیگری تحت نام سرویس قرار بدید.

درمورد سوال آخر هم که خب فیلدهاتون تغییر کرده پس با GII مدل جدید رو تولید و روی قبلی overwrite میکنید. مشکل این کجاس؟

[/font][/rtl]

[rtl]خوب اون قسمت آخر که گفتید برای overwrite کردن مدل.

برای crud هم میشه از همون gii استفاده کرد و overwrite بشن، یا اونها باید دستی تغییر کنند.

[/rtl]

[rtl][font="Tahoma"]با توجه به اینکه در این روش، مدل اصلیتون تغییری نمیکنه، میتونید توسط GII مدل جدید رو تولید و روی قبلی overwrite کنید و یا دستی اون رو ویرایش کنید. فرقی نداره.

[/font][/rtl]