PDA

View Full Version : مشکل با with ؟ (حل شد)



redhat2
جمعه 18 بهمن 1392, 18:55 عصر
سلام ، من از متد with که توی Active record هست استفاده می کنم ، ولی هنوز دلیل استفاده اون را نفهمیدم ، چون که توی کتاب آقای larry ulman گفته شده که مثلا اگه شما 3 تا Relation داشته باشید مثلا user ، comments و file که مربوط به page model هست و بخواین که فقط از user استفاده کنین باید به این صورت استفاه کنین :


$page = Page::model()->with('user')->findByPk('1');
در صورتی که با این حالت هر 3 تا Relation را میشه استفاده کرد یعنی میشه از 2 تا Relation دیگه هم استفاده کرد در صورتی که اینجا فقط من می خوام که Relation یوزر استفاده بشه یا در دستور زیر گفته که فقط username سلکت میشه در صورتی که موارد دیگه هم select میشه مثل email و password که در table یوزر وجود داره :


$page = Page::model()->with(array('user' =>
array('select' => 'username')
))->findByPk($id);


حالا دقیقا فایده استفاده از این متد چیه وقتی میشه بدون استفاده از اون به چیزی که انتظار داریم دست پیدا کنیم ؟

MMSHFE
جمعه 18 بهمن 1392, 21:22 عصر
یک مثال ساده میزنم:


$pages = Page::model()->with(array(
'user'=>array(
'condition'=>'id=:id',
'params'=>array(
':id'=>Yii::app()->user->id,
),
),
))->findAll(array(
'condition'=>'confirmed=:confirmed',
'params'=>array(
':confirmed'=>1,
),
));

این کد، تمام صفحاتی رو که مربوط به کاربر جاری هست و تأیید شده، استخراج میکنه. اگه باز هم ابهامی بود، بفرمایید تا بیشتر توضیح بدم.

redhat2
شنبه 19 بهمن 1392, 08:22 صبح
خوب شما اینجا فقط از relation یوزر استفاده کردین ، در صورتی که برای من چه بیام از with استفاده کنم چه استفاده نکنم همه ی relation ها برای من قابل استفاده هستش ، حالا سواله من اینه که فایده ی این with چیه ؟

MMSHFE
شنبه 19 بهمن 1392, 08:36 صبح
ببینید، الآن بخاطر وجود with فقط رکوردهایی انتخاب میشن که مربوط به کاربر جاری هستن. البته این یک مثال خیلی ساده است. شما با کمک with میتونید برای مثال، تمام کامنتهای مربوط به پستهای تأیید شده یک کاربر خاص رو استخراج کنید (یعنی ارتباط بین 3 جدول comments و posts و users رو برقرار کنید). درواقع عمل Join رو داره برای شما انجام میده.

redhat2
شنبه 19 بهمن 1392, 18:54 عصر
در این مورد درسته ، ولی در مورد اینکه ما مخیوایم فقط یه relation لود بشه ولی همه ی relation ها لود میشه ، چی ؟
یه مثال دیگه از این کتاب که اول اومده و این مثال را زده :


$page = Page::model()->with(array('commetns','user'))->findByPk(1);
echo $page->user->username;

حالا هم model پیج و هم model کامنت هر دو Relation یوزر را دارند ( user ) و گفته با کد بالا یوزری که صفحه را ساخته ، بدست میاد از طرفی در ادامه اومده و گفته که اگه منظور ما یوزری باشه که کامنت را گذاشته ، نه صفحه را ساخته ، چون هر دو مدل page و comments ریلیشن با نام یکسان user را دارند میایم و از کد زیر استفاده می کنیم :


$page = Page::model()->with(array('user','comments','comments.user'))->findByPk(1);
echo $page->user->username;

در حالی که اصلا این کار نمیده ، و در دو حالت یوزری که page را ساخته را return می کنه ، پس فایده استفاده از with برای relation سه گانه چیه وقتی که کار نمیکنه و ما می تونیم با کد زیر یوزر مربوط به کامنت را در بیاریم :


$page = Page::model()->findByPk(1);
echo $page->comments[0]->user->username;

MMSHFE
یک شنبه 20 بهمن 1392, 08:15 صبح
ببینید، بحث اینه که شما میتونید با with عمل Join انجام بدین. نمیدونم چرا منظورم رو متوجه نمیشین. شاید زیاد با Join کار نکردین و مزایاش رو نمیدونید. Relation به تنهایی عمل Join رو برای شما انجام نمیده. برای مثال، شما میتونید با Join سه جدول user و comments و page بیاین صفحاتی رو پیدا کنید که کاربری درج کرده که بیشتر از 3 تا کامنت داره یا از تاریخ خاصی به بعد (یا قبل) کامنت گذاشته درحالی که بدون این حالت، اول باید بیاین کامنتهای مشخص (مثلاً قبل از تاریخ خاص) رو پیدا کنید، بعد بیاین کاربرانشون رو استخراج کنید و ببینید کاربر موردنظر شما داخلشون هست یا نه و اگه بود، اونوقت بیاین صفحاتش رو استخراج کنید.

redhat2
یک شنبه 20 بهمن 1392, 19:48 عصر
اینطور که من حرف شما را فهمیدم ، زمانی که ما از متد Wtih استفاده نمی کنیم ، باید join ها را یکی یکی انجام بدیم تا اون چیزی که آخر مد نظر ماست بدست بیاد ولی با with میشه تمامی join ها را یک آن و همچنین با condition های خاصی که قرار میدیم در with اجرا کنیم و نتیجه نهایی مون را با یک query بدست بیاریم ، درسته ؟ پس اگه اینطور باشه with اینجا نقش یک متدی را برای ما بازی می کنه که دریافت کننده condition و برگردانده result با توجه به condition استفاده شده در اون هست ، درسته ؟

MMSHFE
دوشنبه 21 بهمن 1392, 00:21 صبح
بله دقیقاً. درواقع با with نه تنها میشه join ایجاد کرد، بلکه میشه همزمان شرط هم برای joinها تعریف کنیم.