تعریف رابطه ها

[right][font="Tahoma"]با سلام

من در فهم رابطه ها در اکتیورکورد دچار مشکل هستم و نمیتونم بفهمم باید چیکار کنم.

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

الان من یک دیتا بیس دارم با 4 جدول

یک- جدول کاربرها

دو- جدول پستها

سه- جدول دسته ها

چهار- جدول رابطه پستها با دسته ها که در اون آیدی پست و دسته هایی که اون پست متعلق به اون هست ذخیره میشه

حالا من میخوام پستهایی که متعلق به یک دسته خاص هست رو واکشی کنم.

با توجه به اینکه جدولی که به ما نشون میده که هر پست چه دسته هایی داره یک جدول جدا هست چطور میتونم با تعریف رابطه ها اینکارو بکنم؟[/font][/right]

[left][right]در راهنمایی که هم توی سایت هست و هم پی دی افشو میتونید دانلود کنید اطلاعات خوبی هست. به آدرس زیر مراجعه کنید[/right]

http://www.yiiframew…ng-relationship

[right]خیلی ساده به شکل زیر میتونید رابطه‌ها رو تعریف کنید

در مدل Category باید رابطه را به شکل زیر تعریف کنید[/right]


public function relations() 	{     	

return array(         	

 'posts'=>array(self::MANY_MANY, 'Post',  'tbl_post_category(category_id, post_id)'),     	

); 	}

[right]در مدل Post هم به شکل زیر[/right]


public function relations() 	{     	

return array(         	

 'categories'=>array(self::MANY_MANY, 'Category', 'tbl_post_category(category_id, post_id)'),    	

 ); 	}

[right]حالا اگر فرض کنیم شما یک آبجکت از یک دسته خاص داشته باشید به شکل زیر میتونید پست‌های اون رو دریافت کنید

[left]$category = Category::model()->findByPk($cat_id);

$posts = $category->posts;

[/left][/right][/left]

نشد داداش ! خطا میده…

[right]کدی که توی مدل‌ها نوشتی و کد کنترلر رو و خطایی که میده رو اینجا پست کن ببینیم چی هست[/right]

[right][font="Tahoma"]

این کد مربوط به مدل آیدی پستها و دسته ها هست:


'posts'=>array(self::MANY_MANY, 'FunPosts',  'cats_relation(cat_id, post_id)'),

این هم کد مدل پستها هست


'categories'=>array(self::MANY_MANY, 'CatsRelation',  'cats_relation(cat_id, post_id)'),

این هم کدی هست که پستها رو باید بخونه:




$model = FunPosts::model()->with('categories')->findAll("cat_id=2");

foreach($model as $model){

    echo $model->id."<br>";

    echo $model->persian_write."<br>";

    echo $model->latin_write."<br>";

    echo $model->significance."<br>";

    echo "-----------<br>";

}

کد بالا رو در حالتهای دیگه مثل زیر هم تست کردم:




$model = FunPosts::model()->with('categories')->findByPk(2);

foreach($model as $model){

    echo $model->id."<br>";

    echo $model->persian_write."<br>";

    echo $model->latin_write."<br>";

    echo $model->significance."<br>";

    echo "-----------<br>";

}



اصن قاطی کردم یه وضی !

[/font][/right]

[rtl]ببینید خودفریمورک ابزاری دارد به نام Gii که خیلی راحت و با استفاده از آن خودش برای شما مدل را به همراه تمامی رابطه ها و کنترلر را به همراه تمامی بخش های مورد نیاز برای خواندن و نوشتن و حذفو به روز رسانی از بانک را تولید می کند. به سایت زیر یه نکاهی بندازید کمکتون می کنه:[/rtl]

http://shgn.ir/یادگیری-فریمورک-yii-بخش-۵-crud-gii/

[rtl] همچنین برای کوئری گرفتن از آنها هم اینجا را یه نگاهی بندازید:[/rtl]

http://shgn.ir/کوئری-گرفتن-داده-ها-در-yii-querys/

[rtl] اگر مشکلی بود بفرمایید تا بررسی کنیم;)[/rtl]

[right]توضیحاتی که توی وبلاگ آقای شاهچراغیان هست کامل و خوبه

فقط یک نکته: اگر انجینه تیبل‌های شما وقتی از mysql استفاده می‌کنید

innodb نباشه gii رابطه ‌ها رو به صورت اتوماتیک نمیسازه

[/right]

[rtl]ممون نکته ظریفی بود.

جسارت نباشه ولی می خواهم خواهش کنم که وقتی نوشته هایتان را فارسی می نویسید از ابزار های بالا راست به چپش کنید که خواناتر باشه.[/rtl]

[right]به روی چشم

[/right]

[font=Tahoma][right]با سلام به همه و ممنون به خاطر نظرات. من ظاهرا در درک مفهوم رابطه ها توی یی دچار بد فهمی شدم. امروز صبح توی محل کارم برداشتم جداول و مدلهایی طبق مثال مستندات یی ساختم. با این کار رابطه ها رو تونستم مشاهده کنم و برام ملموس بشه. الان فکر میکنم تا نیمه راه مفهومش رو درک کردم. ولی یه سوالاتی دارم که تا یه ساعت دیگه میپرسم[/right][/font]

[font="Tahoma"][right]ممنون از همه دوستان. من از رابطه ها سر در آوردم :دی به نظرم کسانی که مثل من در یی تازه کار هستند بهتره اول مثالهای خود یی رو تمرین کنند. من چون از تیبل های خودم استفاده میکردم توی ربط دادن رابطه ها به هم گیج شده بودم :دی از پاسخ های دوستان هم ممنون اونها هم روشنگری داشتن توی درکم.[/right][/font]

[font="Tahoma"][right]من مشکلم با اصل رابطه ها حل شد ! ولی ازونجایی که سوالات تمومی نداره ! میخواستم تاپیک رو ادامه بدم. من الان کدی به صورت زیر دارم:[/right][/font]




    $cat = Cats::model()->find ("latin_title='news'");

    echo "موضوع: ".$cat->title.": <br>";

    $catsRelations = $cat->cats_posts_relations;

    foreach($catsRelations as $catsRelation){

        $post = Posts::model()->findByPk($catsRelation->post_id);

        echo $post->title."<br>";

    }



[font="Tahoma"][right]

در مدل کتز یا دسته ها هم رابطه زیر رو دارم:

[/right][/font]




      'cats_posts_relations' => array(self::HAS_MANY, 'CatsRelation', array('cat_id'=>'id')),



[font="Tahoma"][right]

خروجی کدهای بالا میشه:

موضوع:اخبار:

خبر اول

خبر دوم

خبر اول از ایران

خبر اول از جهان

خبر دوم از ایران

کاری که کردم اینه: از مدل کتز موضوعی که عنوان لاتینش نیوز هست را خوندم. بعد به رابطه مراجعه کردم و آیدی پستهایی که مربوط به اون موضوع بودن را استخراج کردم و بعد عنوان اون پستها رو نمایش دادم.

هدف جدید اینه: چطور میتونم پستهای چند موضوع رو به صورت همزمان فراخوانی کنم. مثلا طوری که از اخبار فقط اخبار ایران و جهان رو نمایش بدم و خروجی اینطوری بشه:

موضوع:اخبار ایران , اخبار جهان:

خبر اول از ایران

خبر اول از جهان

خبر دوم از ایران

پی نوشت: با کدهای پی اچ پی و دستورات تقریبا تو در تو میتونم به هدفم برسم اما میخوام راه منطقی و درستش رو داخل فریم ورک یی بدونم

[/right][/font]

[font="Tahoma"][right]لطفا راهنماییم کنید زودتر! ثواب داره. هفته بعد امتحان دارم ![/right][/font]

[rtl]

جداول و روابط شون را بزارید تا بشه بررسی اش کرد

[/rtl]

[font="Tahoma"][right]من در اول نوشتم توضیحاتی دادم که جدول و رابطه اون رو با جدولی که مد نظرم بود رو گفتم…[/right][/font]

[font="Tahoma"][rtl]

برای اینکار تنها کافیست ریلیشن های مورد نیاز رو در comment های table بنویسید! یکمی مسخرس! ولی این راه حلیه که yii برای پوشش دادن موضوع ساخت خودکار relation ها در انجین MyISAM توسط gii اختراع کرده ;)

برای مثال این کد:

[/rtl]




CREATE TABLE Foo

(

  id INTEGER NOT NULL PRIMARY KEY

);

CREATE TABLE bar

(

  id INTEGER NOT NULL PRIMARY KEY,

  fooID INTEGER

 	COMMENT 'CONSTRAINT FOREIGN KEY (fooID) REFERENCES Foo(id)'

);



http://www.yiiframew…en/database.arr

[/font]