View Full Version : در مورد relation ها
qartalonline
جمعه 10 مرداد 1393, 21:05 عصر
سلام،
من یه جدول دارم به عنوان user که اطلاعات اصلی کاربران در اون ذخیره میشه و چند تا جدول دارم مثل user_profile ، user_setting ، user_statistic و ... که تعدادشون تقریبا زیاده و با جدول user از طریق relation ها ارتباط دارن.
میخواستم بدونم نحوه loading مدلهای این جداول چجوری هستن؟ lazy loading یا eager loading ؟
دوم اینکه میخواستم چک کنم مثلا اگه تو جدول user_profile رکوردی برای کاربری که اطلاعاتش تو جدول user هستش وجود نداشته باشه یه رکورد تو جدول user_profile براش ایجاد بشه. این قسمت رو چجوری حل کنم؟ یعنی دقیق نمیدونم کد مربوط به ایجاد رکورد رو تو کدوم model و داخل کدوم function بنویسم.
ممنون.
Veteran
جمعه 10 مرداد 1393, 21:27 عصر
سوال اولو درست متوجه نشدم.
اما سوال دوم رو میتونی به شکل های مختلف انجام بدی
بنظرم میشه موقعه ثبت نام کاربر رکورد رو ایجاد بکنی با مقادیر پیش فرض و استفاده از تراکنش ! یعنی کد ثبت نام + ساخت رکورد جدول پروفایل رو با تراکنش انجام بدی که مطمئن شی برای هرکاربر ثبت نام شده حتما یک رکورد در پروفایل هم وجود داره.
یا اینکه اینکارو نکنیم و بعد از ثبت نام و ورود به پنل بگیم کاربر گرامی شما پروفایل ندارید ! لطفا پروفایل خودتون رو کامل کنید.
و با کد زیر چک بکنیم.
if(!Profile::model()->exists('user_id=:userID',array(':userID'=>Yii::app()->user->id))){
// create profile
}
چک میکنه کاربر جاری توی جدول پروفایل رکورد داره ؟ اگه داشت با ! شرط نقض میشه و کدی اجرا نمیشه. و اگر نداشت با ! شرط برقرار هستو میتونین رکورد رو درج کنین
یا میتونی توی متد ویرایش پروفایل قبل از ویرایش همین کدو قرار بدی که اگه رکوردی وجود نداشت براش رکوردی ساخته بشه.
و ده ها راه دیگه :بامزه:
qartalonline
جمعه 10 مرداد 1393, 22:01 عصر
منظورم از سوال اول این بود که وقتی این جدول ها با جدول user ارتباط دارن و وقتی فقط از مدل user استفاده میکنیم باز اطلاعات از این جدول ها خونده میشه یا نه؟ بطور ساده اینکه آیا فقط زمانی اطلاعات از جدول user_profile خونده میشه و کوئری براش اجرا میشه که ما از $userModel->userProfile استفاده میکنم یا نه همیشه کوئری براش اجرا میشه.
مثلا کد زیر در view مربوط به پروفایل کاربر.
<?php
/* @var $model User */
echo $model->userProfile->birth_time;
البته اونطوری که فهمیدم lazy loading هستش.
برای سوال دوم . مشکلی که با چک کردن دارم اینکه دقیق نمیدونم کجا چک کنم؟ مشکلی با ایجاد رکورد در هنگام ثبت نام داشتم این بود که شاید کاربر نیازی به همه این جدول ها نداشته باشه. ولی فک کنم راحت ترین روش ایجاد این جداول بعد از تایید اکانت کاربر باشه.
Veteran
جمعه 10 مرداد 1393, 22:17 عصر
نه شما وقتی از جدول کاربران کاری انجام میدید، جدولهایی که باهاش در ارتباط هستند لود نمیشن! مگر استفاده از ربلیشن هاش. که تازه برای ریلیشن هم لود نمیشه ! کوئری جداگانه ارسال میشه ( جوین انجام نمیشه که این قابل تنظیمه)
در مورد سوال دوم اگر نظر بنده رو بخواید همچین چیزایی رو میزارم به عهده کاربران! یعنی پروفایل براش نمیسازم و توی پنل هرموقعه خواست خودش بره بسازه!
یعنی من اگه باشم رکوردی برای کاربر در جدول پروفایل در نظر نمیگیرم. و یک صفحه قرار میدم برای ساخت پروفایل ! و توی actionCreate چک میکنم اگر رکوردی برای کاربر جاری وجود نداشت بسازه و دفعه های بعد اپدیت بشه !
چون ممکنه همه کاربران پروفایل نخوان ؟! یا همینجوری ثبت نام کرده باشن و یا..... و ویگه رکرود الکی نداریم.
MMSHFE
شنبه 11 مرداد 1393, 12:16 عصر
ضمن تأیید صحبتهای Veteran عزیز، این نکته رو هم اضافه کنم که درست متوجه شدین. Yii بطور پیشفرض از Lazy Loading استفاده میکنه مگه اینکه خودتون با with از حالت Eager Loading استفاده کرده باشین که اون رو هم میتونید تنظیم کنید که Join بزنه یا کوئری جداگانه ارسال کنه. Lazy Loading هم که همیشه از کوئری جداگانه استفاده میکنه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.