View Full Version : چند سوال راجعبه yii
hooman.pro
جمعه 03 مرداد 1393, 12:14 عصر
سلام استاد شهرکی بنده در اواسط دوره آموزش yii هستم، که چند سوال ذهنم رو مشغول کرده خواهشا هر کدام از دوستان اطلاع دارن لطف کنن پاسخ بفرمایند:
1- فرض کنید یه سایت داریم 3 نوع موجودیت داره به نام های پست(مثل فیس بوک)، صفحه فیلم، صفحه Y, خوب هر کدام از این ها در دیتا بیس یک جدول و فیلد id را دارند، حالا میخواهیم امکان نظر دادن در سایت ساخته شود، من قبل از کار با yii بدون ایجاد هیچ گونه رابطه بین جدول ها به این صورت عمل میکردم
جدول نظرات:
-id
-content
-...
-type که نوع enum میدادم و در این مثال سه تایپ (film,post,y) تعریف میکردم
-reff_id که بسته به نوع آی دی جدول مورد نظر بود و بعدا هم از طریق نوع مثلا نظرات مربوط به پست ها رو پیدا میکردم
اما خوب الان دیگه اصلا روش قبلی رو دوست ندارم مخصوصا که در yii با ایجاد رابطه ها امکانات خوبی مثل اکتیو رکورد فراهم میشه و میخوام بدونم شما برای ایجاد رابطه بین این یک جدول و سه جدول دیگر چه راه حلی دارید.
2- چرا زمانی که
در فایل _from برای ویو issue اینیبل ایجکس ولدیشن true می گردد. اما در اکشن create خط مربوط به ایجکس ولیدیشن کامنت هست مشکل به وجود میاد که چند بار رکورد تکراری ذخیره می شود!
کلا منطقش چیه که به این مشکل بر میخوره؟
3- قبلا گفته بودید فیلم آموزش yii پیشرفته تابستان عرضه می شود. اما خبری نشد؟
4- میخواهم با دوستان برنامه نویسم روی یک پروژه با yii به صورت گروهی کار کنم. راهکار شما چیست؟ از چه نرم افزاری چگونه استفاده کنم؟ (نمیخوام مثل گیت هاب وقتی پول نمیدی پروژه رو پابلیک بزاره و همه دسترسی داشته باشن)
M.Rahi
جمعه 03 مرداد 1393, 16:33 عصر
سلام
1) نوع فیلد type رو بهتره تغییر بدی به tinyint با طول 1 و یه مدل توی پروژه ایجاد کن به اسم type . حالا توی مدل به تعداد صفحاتی که داری ، const تعریف کن و یه مقدار عددی بهشون اختصاص بده.
مثلا :
const film=1;
حالا هر جایی که کامنت جدیدی قراره اضافه بشه ، میتونی خیلی راحت از طریق مدل type به const ها دسترسی داشته باشی: (Type::film) ، که مقدار اون (عدد 1) در فیلد type قرار میگیره و توی select کردن هم به همین صورت...
یه نکته که خیلی مهمه اینه که مواقعی از نوع enum استفاده کن که مطمئن باشی در آینده تعداد آیتم های اون تغییر نمیکنه؛ مثلا فیلد جنسیت. ممکنه صفحات شما بعدا اضافه یا کم بشه که قاعدتا باید آیتم های enum رو تغییر بدید که مشکل ساز میشه (مقادیری که برای رکوردها تعیین شده ریست میشه). سعی کن از یه جدول جدا استفاده کنی یا مثل روشی که گفتم ، مدلی ایجاد کنی که در دیتابیس نیاز به ایجاد کردن نداره.
موفق باشید
hooman.pro
جمعه 03 مرداد 1393, 22:36 عصر
دوست عزیز ممنون از پاسخ شما اما منظور من این است که وقتی از یک جدول برای تمام نوع نظرات استفاده میشود دیگر ریلیشن نمیشود برقرار کرد.
که البته 2 راه حل دارم یک اینکه: خوب سه جدول برای نظرات داشته باشیم که هر کدام با جدول مورد نظر رابطه داشته باشه، راه حل دوم اینکه سه فیلد و سه رابطه با جداول دیگر باشد و هر وقت نظری مربوط به فیلم بود مثلا فیلد film_id مقدار بگیرد و فیلد های y_id , post_id را null بگذاریم.
چون اگر رابطه برقرار نشود اولا که اصول طراحی پایگاه داده رعایت نشده دوما از امکانات اکتیو رکورد yii نمیتوان به خوبی استفاده کرد
M.Rahi
شنبه 04 مرداد 1393, 02:50 صبح
اگر مصمم به جدا سازی هستی، راه اول رو انتخاب کن و 3 جدول بساز.
راه دوم زیاد اصولی نیست.
hooman.pro
یک شنبه 05 مرداد 1393, 09:31 صبح
استاد شهرکی ممنون میشم اگر لطف کنید خودتون به سوالاتم پاسخ بدید
MMSHFE
دوشنبه 06 مرداد 1393, 16:37 عصر
1- فرض کنید یه سایت داریم 3 نوع موجودیت داره به نام های پست(مثل فیس بوک)، صفحه فیلم، صفحه Y, خوب هر کدام از این ها در دیتا بیس یک جدول و فیلد id را دارند، حالا میخواهیم امکان نظر دادن در سایت ساخته شود، من قبل از کار با yii بدون ایجاد هیچ گونه رابطه بین جدول ها به این صورت عمل میکردم
جدول نظرات:
-id
-content
-...
-type که نوع enum میدادم و در این مثال سه تایپ (film,post,y) تعریف میکردم
-reff_id که بسته به نوع آی دی جدول مورد نظر بود و بعدا هم از طریق نوع مثلا نظرات مربوط به پست ها رو پیدا میکردم
اما خوب الان دیگه اصلا روش قبلی رو دوست ندارم مخصوصا که در yii با ایجاد رابطه ها امکانات خوبی مثل اکتیو رکورد فراهم میشه و میخوام بدونم شما برای ایجاد رابطه بین این یک جدول و سه جدول دیگر چه راه حلی دارید.
متوجه موجودیتهاتون نشدم ولی در کل برای ارتباط یک به چند (مثل دسته بندی و پست) باید دو جدول جداگانه داشته باشین یکی (مثل دسته بندی) کلید اصلی داره که معمولاً id هست و یکی دیگه یک کلید خارجی داره (مثل cat_id) که وصل میشه به جدول اصلی و توی relation مدل از ارتباط self::BELONGS_TO توی جدول پست و از self::HAS_MANY توی جدول دسته بندی استفاده میکنید. ارتباط یک به یک (مثل جدول کاربر و جدول پروفایل) هم به همین شکله فقط توی جدول وابسته (مثلاً پروفایل) فیلد user_id رو Unique میکنید. توی relation هر دو جدول هم از ارتباط self::HAS_ONE استفاده میکنید. ارتباط چند به چند (مثل جدول کاربر و جدول پروژه که یک نفر میتونه توی چند پروژه باشه و ضمناً یک پروژه هم میتونه چند کاربر داشته باشه) با کمک جدول واسط انجام میشه که این جدول واسط، دو کلید خارجی داره که یکی به جدول کاربر وصل میشه و یکی دیگه به جدول پروژه و توی relation هر دو جدول هم از ارتباط self::MANY_MANY استفاده میکنید. توضیحات بیشتر درمورد پیاده سازی هر سه روش هم توی پکیج توضیح و مثال ارائه شده.
2- چرا زمانی که
در فایل _from برای ویو issue اینیبل ایجکس ولدیشن true می گردد. اما در اکشن create خط مربوط به ایجکس ولیدیشن کامنت هست مشکل به وجود میاد که چند بار رکورد تکراری ذخیره می شود!
کلا منطقش چیه که به این مشکل بر میخوره؟
ارتباطی به نوع ولیدیشن نداره. شما باید رول unique رو اضافه کنید که به تکراری بودن گیر بده. همچنین توی دیتابیس هم فیلد مربوطه رو Unique کنید تا وقتی Gii براتون مدل رو میسازه، خودش حواسش باشه رول رو بسازه.
3- قبلا گفته بودید فیلم آموزش yii پیشرفته تابستان عرضه می شود. اما خبری نشد؟
پکیج پیشرفته به بعد از ارائه نسخه رسمی Yii2 موکول شد تا با ساختار جدید، عرضه بشه.
4- میخواهم با دوستان برنامه نویسم روی یک پروژه با yii به صورت گروهی کار کنم. راهکار شما چیست؟ از چه نرم افزاری چگونه استفاده کنم؟ (نمیخوام مثل گیت هاب وقتی پول نمیدی پروژه رو پابلیک بزاره و همه دسترسی داشته باشن)
در این مورد، دوستان توضیحات کامل دادن. ضمناً خودتون میتونید یک سرور Git یا SVN راه بندازین.
hooman.pro
دوشنبه 06 مرداد 1393, 23:05 عصر
استاد موجودیت های به این شرح است و کلا داستان:
در یک سایت موجودیتی داریم به اسم پست، خوب این پست ممکن است از 0 الی بی نهایت نظر دریافت کند. موجودیت دیگری داریم به اسم صفحه فیلم که شرحی از فیلم دارد. حالا این فیلم هم ممکن است از 0 الی بینهایت نظر دریافت کند. اینها مهم نیست و مهم این هست که نظرات فیلم و پست تمامی مشخصاتشان یکی است بجز فیلدی که باید به جدول اصلی اشاره کند. یعنی اگر بخواهم بهتر بگم:
موجودیت پست:
- id
- title
- content
- user id
موجودیت نظر پست ها
- id
-content
-user id
- post id
موجودیت فیلم
- id
- director
-auther
موجودیت نظر فیلم ها
- id
-content
-user id
- film id
خوب همین طور که میبینید موجودیت نظر فیلم ها و نظر پست ها همه فیلد ها یکی هست و فقط فیلد post id و film id متفاوت هستند چون یکی میخواهد به جدول پست و دیگری به جدول فیلم کلید خارجی شود
کاری که من قبلا میکردم این بود که کلید خارجی تعریف نمیکردم و نام فیلد رو reff id در نظر میگرفتم و یک فیلد دیگر اضافه میکردم و نام آن رو type میگذاشتم، سپس در کد php به وسیله این تایپ میفهمیدم که به کدام جدول اشاره دارد
حالا میخوام بدونم کارم درست بوده؟ نبوده؟ راه درست چیست آیا نظرات باید 2 جدول بماند؟ و یا مانند کار قدیمی من یک جدول شوند؟ اونوقت اگر یک جدول شد ارتباط و کلید خارجی چگونه تعریف شود؟
hooman.pro
سه شنبه 07 مرداد 1393, 08:10 صبح
حالا تصور کنید که قرار شده به پروژه امکان پاسخ دادن به نظرات را درست کنیم: (نظر به نظر)
خوب اینطور میشه :
موجودیت پاسخ به نظر پست ها:
id
-content
-user id
- post_comment_id
موجودیت پاسخ به نظر فیلم ها:
id
-content
-user id
- film_comment_id
خوب 2 جدول قبلی نظر پست، نظر فیلم و این 2 جدول پاسخ به نظر فیلم و پاسخ به نظر فرم تمامی فیلد هاشون یکسان است بجز یک فیلد. آن هم فیلدی است که قرار است به جدول مرجع اشاره کند و کلید خارجی بشود.
راه حل من این بود که 4 جدول را ادغام میکردم و اون فیلد که قرار بود کلید خارجی باشد رو کلید خارجی نمیکردم و کنارش یک فیلد دیگر در نظر میگرفتم که از اون طریق معلوم میشد که این نظر به کدام جدول اشاره میکند. حالا میخواهم بدونم راه حل شما چیست؟ چندین جدول یک جدول! با کد های yii که میگه belongto و hasmany و ... مشکلی ندارم و تقریبا درکشون کردم. مشکل اصلی سر طراحی چنین موجودیتی هست. فکر کنم دیگه مقصودم مشخص شده باشه، جناب شهرکی باز هم اگر ابهامی هست بفرمایید بیشتر توضیح میدم
MMSHFE
چهارشنبه 08 مرداد 1393, 19:11 عصر
همون روش چند جدول مجزا خوبه. فقط یک فیلد parent_id به جدول نظرات اضافه کنید و برای نظراتی که مستقیماً ارسال میشن این فیلد Null باشه و برای نظراتی که در پاسخ به نظر دیگری ایجاد میشه، این فیلد رو با id نظر والد مقداردهی کنید. دو ارتباط دیگه هم به مدل اضافه کنید:
'parent'=>array(self::BELONGS_TO, 'Comments', 'parent_id'),
'replies'=>array(self::HAS_MANY, 'Comments', 'parent_id'),
الان توی هر نظر با parent<- میتونید به نظر والد و با replies<- میتونید به پاسخهای اون دسترسی داشته باشین.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.