بهترین روش برای ذخیره و به روز رسانی ارتباطات مدل ها در Yii

[font="Tahoma"][rtl]سوال بنده اينه، مثلا شما يه جدول داري post با فيلد هاي id, title, content بعد يه جدول ديگه داريم به نام category با فيلد هاي. id, name يه جدول ديگه داريم به نام post_category كه دو تا فيلد داره post_id, category_id و واسه تکمیل بودن یه جدول دیگه داریم به نام post_meta که فیلداش id, post_id, meta هست.

کد relation ها هم پایین نوشتم :[/rtl][/font]




        //Post.php Model

	public function relations()

	{

		return array(

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

			'metas' => array(self::HAS_MANY, 'PostMeta', 'post_id'),

		);

	}

        //Category.php Model

	public function relations()

	{


		return array(

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

		);

	}

        //PostMeta.php Model

	public function relations()

	{

		return array(

			'post' => array(self::BELONGS_TO, 'Post', 'post_id'),

		);

	}



[font="Tahoma"][rtl]حالا ما میام یک controller به صورت زیر تعریف می کنیم[/rtl][/font]




class PostController extends Controller

{

///****code

    public function actionCreate()

    {

        $post = new Post;

        $meta = new PostMeta;

        $meta->info = 'test';

            $post->title = 'hello world';

            $post->content = 'hello world content';

            $post->metas =  $meta;

            $post->categories = array(Category::model()->findByPk(1));


            $post->save(false);


    }

///****code

}



[font="Tahoma"][rtl]ولی خوب کد بالا فقط یه Post جدید به به جدول post اضافه می کنه حتی اگه post->categories و post->metas مقدار دهی شده باشه بقیه مدل ها رو فراخوانی نمیکنه که اونا هم تو یه دستور همراه با Post جدید تو جدول مخصوص به خودشون save بشن. یه کار میشه کرد اونم اینه که ولی تو رابطه Many-Many جواب نمیده.[/rtl][/font]




class PostController extends Controller

{

///****code

    public function actionCreate()

    {

        $post = new Post;

        $meta = new PostMeta;

        $meta->info = 'test';

            $post->title = 'hello world';

            $post->content = 'hello world content';

            $post->metas =  $meta;

            $post->categories = array(Category::model()->findByPk(1));


            if($post->save(false)) {

                   $meta->post_id = $post_id;

                   $meta->save();

            }


    }

///****code

}



[font=“Tahoma”][rtl]که خوب این خوب نیست دیگه Cake اینکارو یه دفعه باهم انجام میده، رو دمم مونده چرا yii انجام نمیده!! ;D

پ.ن : در ضمن extention و behavior معرفي نكنيد يا اگه مي كنيد خودتون خوب باهاش كار كرده باشيد، كه تو update و save و validation درست كار كنه من esaverelation وwithrelationbehavior رو كار كردم نقص داشتن[/rtl][/font]

[right]

سلام سامان جان

دادش گلم من هیچی از متن نفهمیدم ;)

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

[/right]

[rtl]

[font="Tahoma"]برای فارسی نوشتن نوشته ها اونها روبین دوتا تگ

[/font]

[font="Tahoma"][/rtl]


[rtl] متن فارسی[/rtl] 

[/font]

[font="Tahoma"][rtl]بنویسید

[/font]

[font="Tahoma"][/rtl] [/font]

[right][font="Tahoma"]متاسفم حواسم نبودچون متن رو قبلا نوشته بودم چک نکردم[/font][/right]

[rtl]شما بودی که توی فروم ایرانphp همین سوال را کرده بوی نه.

اونجا هم جواب دادم، ولی اینجا هم میگم:

به این لینک یه نگاه بندازید دستتونم میاد چکار کنید. مثال بلاگ خود yii هست:

comment.create

[/rtl]

[rtl]آره من بودم، ولی اینی که گفتی هیچ ربطی نداره به موضوع من[/rtl]

[rtl]خوب به اینجا یه نگاهی بنداز و توی صفحه دنبال کلمهactionCreate() بگرد.

این خود جواب شما است.

[/rtl]

[rtl]

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

[/rtl]

[rtl][font="Tahoma"][right]اگر اشتباه نکنم توی یه تاپیکی کسی یه همچین مشکلی رو داشت و همچنین از cakephp مثال زده بود. که samdark که یکی از توسعه دهنده های فعال Yii هستش گفته بود که برای Yii2 نقشه اش رو کشیده اند. باز اگر اشتباه نکنم ایشان هم یک behavior معرفی کرده بودند. تاپیکش رو پیدا کردم میزارم.[/right][/font][/rtl]

[font="Tahoma"][right]اینم لینکش[/right][/font]

[rtl]دست همگی درد نکنه خودم سعی می کنم یک behavior خوب واسش در آینده بنویسم اگه نیومد

کلا کیک خیلی دیکه خارج از چهارچوب فکر کرده لعنتی کارش درسته اینو که دیدم yii نداره خیلی دلمو زد حیف

امیدوارم تو 2 بیاد با اون behavior کار کردم زیاد جالب نیست تو آپدت مشکل داره[/rtl]

[font="Tahoma"][rtl]چرا از Doctrine استفاده نمی کنید؟[/rtl][/font]

[rtl][font="Tahoma"]باهاش تا بحال کار نکردم چی هست؟ بیشتر توضیح میدی؟[/font][/rtl]

Object-relational mapping (ORM, O/RM, and O/R mapping) in computer software is a technique for converting data between incompatible type systems in object-orinted programming languages. read more

[rtl]تا جایی که اطلاع دارم دو تا الگو (pattern) برای پیاده سازی ORM وجود داره. یکی ActiveRecord و اون یکی استفاده از Data Mapper + Unit Of Work

Doctrine 1.x مثل Yii ActiveRecord از اکتیو رکورد استفاده می کرد. Doctrine 2 از Data Mapper + Unit Of Work بهره می گیره.

تجربه ی عملی آنچنانی با Doctrine ندارم. مدتی پیش که با سیمفونی میخواستم ادامه بدم مجبور شدم کمی هم در مورد Doctrine بخونم. فقط از اونجایی که به شکل یک پروژه ی مستقل روی ORM کار می کنند حتما برای مسئله ای که بهش برخورد کردید راه حل داره.

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

البته ORM های زیاد دیگه ای هم مثل redbeanphp و propel هم وجود دارند.

[/rtl]

[font="Tahoma"] [rtl]احتمالاً منظورت از این:[/rtl]




if($post->save(false)) {

	$meta->post_id = $post_id;

	$meta->save();

}



[rtl]

همین بوده:[/rtl]




if($post->save()) {

	$meta->post_id = $post->getPrimaryKey();

	$meta->save();

}



[rtl]

من که از همین روش استفاده میکنم.[/rtl]

[/font]

[rtl]خوب شاید این باشه.

ولی اینطور که دوستان کیکی می گویند وقتی شما متد saveAll() را بزنی همه دیتاها خودکار ذخیره می شوند و نیاز به مقدار دهی و ذخیره جداگانه آنها نیست.

ولی برای اون دکترین که دوستمون گفتند، گشتم خود Yii براش اکستنشن هم داره ولی آیا کسی تا بحال با اون کار کرده؟

می تونه درباره اش توضیح بده؟ از صفر تا صدش.[/rtl]

http://www.yiiframew…n/doctrine2orm/