PDA

View Full Version : ارتباط جداول و ثبت اطلاعات در چند جدول و خواندن از چند جدول



rahahost
پنج شنبه 17 مهر 1393, 15:57 عصر
سلام خدمت همه ی دوستان

در مورد ارتباطه درون لاراول به مشکل برخوردم که نتونستم رفعش کنم و از شما دوستان راهنمایی میخوام :)


سوال اول اینکه hasmany چی هست و چطوری ازش استفاده میکنن ‌؟
سوال دومم : belongToMany چیه و کجا و چطوری ازش استفاده میشه ؟


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

من 3 تا جدول دارم با اسم های posts, tags , post_tag
من برای هر رکورد از جدول پست میخوام چندتا تگ داشته باشم که بتونم ازش استفاده کنم ( مثل تگهای مطالب سایت ها )

هر پست میتونه شامل چندین ت باشه که هر تگ با یک رکورد باید درون جدول tags ثبت بشه ( بخش اول )
و آی دی خبر و پست درون جدول post_tag ثبت میشه به این صورت که :
آی دی پست و آی دی تگ رو میگیره و درون یک رکورد ثبت میکنه ، حالا اگه خبر شمار 1 ما ، 5 تا تگ داشته باشه ، باید 5 رکورد با post_id شماره 1 داشته باشیم که tag_id متفاوتی دارن ( فکر کنم تونستم منظورمو برسونم :D )


برای این کار باید چندکار همزمان انجام بشه :
1 - تگ هایی که درون input هست و با ویرگول از هم جدا شدن رو ، هر کدوم رو با یک رکورد به جدول tags بریزم
2 - خبر رو درون جدول posts ثبت کنه
3 - آی دی خبر و آی دی های تگ هارو بگیره و درون جدول post_tag ثبت کنه ( هر تگ درون یک رکورد )


حالا سوال اینجاست که چطور باید این عملیات انجام بشه ؟

ممنون میشم راهنماییم کنید .

rezakho
پنج شنبه 17 مهر 1393, 17:41 عصر
سلام

1- hasMany یک ارتباط یک به چند ایجاد میکنه، مثلا یوزر میتونه چندین پست داشته باشه که با این ارتباط رو می سازند
2- belongToMany برای ساختن یک ارتباط چند به چند استفاده میشه، مثلا یک پست چندین تگ داره و همچنین یک تگ به چندین پست ارتباط داره، همین برای مثال شما کاربرد داره

3- مثال شما یک ارتباط چند به چند هست، همین "یک پست چندین تگ داره و همچنین یک تگ به چندین پست ارتباط داره"

الف- ابتدا با استفاده از یک پلاگین jQuery مثل http://aehlke.github.io/tag-it تگ های کاربرت رو بگیر، این پلاگین ایجکسی تگ های قبلی رو میتونه کامل کنه، Autocomplete
ب- بعد از ارسال تگ ها، تگ ها رو طبق مستندات پلاگین بگیر، تکراری ها رو حذف کن، با یک روش دلخواه خودت، اونهایی که با تگ های جدول یکی هستند رو فیلتر کن و جدید ها رو ذخیره کن، با یک حلقه ذخیره کن و id ها رو نگه دار
ج- پست رو ذخیره کن و id اش رو نگه دار
د- id پست و id تگ ها رو در جدول واسط ذخیره کن

rahahost
پنج شنبه 17 مهر 1393, 18:48 عصر
سلام

1- hasMany یک ارتباط یک به چند ایجاد میکنه، مثلا یوزر میتونه چندین پست داشته باشه که با این ارتباط رو می سازند
2- belongToMany برای ساختن یک ارتباط چند به چند استفاده میشه، مثلا یک پست چندین تگ داره و همچنین یک تگ به چندین پست ارتباط داره، همین برای مثال شما کاربرد داره

3- مثال شما یک ارتباط چند به چند هست، همین "یک پست چندین تگ داره و همچنین یک تگ به چندین پست ارتباط داره"

الف- ابتدا با استفاده از یک پلاگین jQuery مثل http://aehlke.github.io/tag-it تگ های کاربرت رو بگیر، این پلاگین ایجکسی تگ های قبلی رو میتونه کامل کنه، Autocomplete
ب- بعد از ارسال تگ ها، تگ ها رو طبق مستندات پلاگین بگیر، تکراری ها رو حذف کن، با یک روش دلخواه خودت، اونهایی که با تگ های جدول یکی هستند رو فیلتر کن و جدید ها رو ذخیره کن، با یک حلقه ذخیره کن و id ها رو نگه دار
ج- پست رو ذخیره کن و id اش رو نگه دار
د- id پست و id تگ ها رو در جدول واسط ذخیره کن

آقا رضای گل ، ممنون از جوابی که دادی :)

امکانش هست یه مثال برام بزنی واسه همین ارتباط چند به چند ؟

تو همون سوالم یه مسئله ی دیگه ای هم هست ، اینکه اگه تو مرحله ارسال داده ها به دیتابیس ، اگه دو مرحله اول انجام بشه ( اضافه شدن پست و اضافه شدن تگ ) ، و در مرحله ی آخر که مربوط به اضافه کردن آی دی پست و آی دی تگ هست به مشکل بر بخوره ، چطور باید دو مرحلهی قبل رو نادیده گرفت ؟

منظورم اینه که درصورتی که همه مراحل درست انجام نشد ، مراحل انجام شده پاک بشه و از نو تلاش کنیم .

ممنون.

farzadyazdan
پنج شنبه 17 مهر 1393, 20:49 عصر
سلام
فکر میکنم این مقاله سوال جواب شما باشه
http://johnveldboom.com/posts/5/working-with-data-in-pivot-tables-using-laravel-4-eloquent-orm

http://www.developed.be/2013/08/30/laravel-4-pivot-table-example-attach-and-detach/

rahahost
شنبه 19 مهر 1393, 13:50 عصر
سلام
فکر میکنم این مقاله سوال جواب شما باشه
http://johnveldboom.com/posts/5/working-with-data-in-pivot-tables-using-laravel-4-eloquent-orm

http://www.developed.be/2013/08/30/laravel-4-pivot-table-example-attach-and-detach/


ممنون فرزاد جان ، خیلی کارمو راه انداخ و تقریبا مشکلم حل شد .


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

تو این کد :



$post = new Post; // to update: $post = Post::find(1);
$post->title = Input::get('title');
$post->body = Input::get('body');
$post->save();

$post->tags()->sync(array(1,2,3,4)); // tag ids



در خط آخر میگه آی دی تگ هاتون رو واد کنید در صورتی که من همراه با ارسال فرمم دارم تگهارو هم میفرستم ، چطور میتونم وقتی تگی ثبت شد ، آی دی اون رو بردارم و اینجا قرار بدم ؟
اگر تگ قبلا وجود داشته باشه ، میشه آی دی تگ رو گرفت و اضافه کرد اما اگه نباشه و قرار باشه در دم اضافه بشه ، آی دی رو باید از کجا بیارم ؟

ممنون میشم راخنماییم کنید .

rezakho
دوشنبه 21 مهر 1393, 17:09 عصر
اینجا با یه حلقه می تونی تگ ها رو چک کنی، اگر داخل جدول بود که واکشی کنی و ای دی رو بگیری و اگر نبود ذخیره کنی و بعد ای دی رو بگیری
مثلا کد زیر


$tagNames = Input::get('tags');

$ids = [];

foreach($tagNames as $tagName)
{
if($tag = Tag::where('name', $tagName)->first())
{
$ids[] = $tag->id;
}
else
{
$tag = new Tag;
$tag->name = $tagName;
$tag->save();

$ids[] = $tag->id;
}
}


البته این کد سربار کمی داره که به خاطر روانتر بودنش مثال زدم، خودتون باید بهترش رو بنویسید، مثلا یک کوئری برای واکشی و ... انجام بدید

rahahost
دوشنبه 21 مهر 1393, 18:24 عصر
دوستان ، من این روش رو انجام دادم اما نمیدونم درسته یا نه !



public function postCreate()
{
$title = Input::get('title');
if(isset($title))
{
$post = new post();
$post->title = $title;
$post->categori_id = Input::get('categori_id');
$post->text = Input::get('text');
$post->slug = str_replace(' ', '-' ,rtrim($title));
$post->author_id = Auth::user()->id;


if($post->save())
{
$mytags = Input::get('tags');
$mytags = explode(',',str_replace( ' ', '-' , trim($mytags) ));
$count = count($mytags);

$tag_id = array();
$loop = 0;

while($count > $loop )
{
$tag_find = DB::table('tags')->where('name', '=' , $mytags[$loop] )->first();
if($tag_find)
{
$tag_id[] = $tag_find->id;
}
else
{
$tag = new tag;
$tag->name = $mytags[$loop];
$tag->save();
}
$loop++;
}

$post->tags()->sync($tag_id); // tag ids

return Redirect::to('admin/posts')->with('msg', 'خبر با موفقیت درج گردید .');
}
}
else
{
return Redirect::to('admin/posts')->with('msg', 'اطلاعات وارد نشده است ');
}
}

rahahost
چهارشنبه 23 مهر 1393, 09:19 صبح
چقدر تالار لاراول فعال بوده !

به نظرم بودن یا نبودنش هیچ فرقی به حال کاربران نمیکنه !

دریغ از یه اضهارنظر !

ni.alpr
سه شنبه 29 مهر 1393, 17:03 عصر
پروسه انجام دادنش که درست هست ، فقط یه قسمت رو متوجه نمی شم



else{
$tag = new tag;
$tag->name = $mytags[$loop];
$tag->save();
}


توی قسمت else نمی خواید id رو به آرایه اضافه کنید ؟

rahahost
دوشنبه 12 آبان 1393, 11:51 صبح
پروسه انجام دادنش که درست هست ، فقط یه قسمت رو متوجه نمی شم



else{
$tag = new tag;
$tag->name = $mytags[$loop];
$tag->save();
}


توی قسمت else نمی خواید id رو به آرایه اضافه کنید ؟


فراموشم شد گد اصلاح شده رو بذارم ;)




public function postCreate()
{
$validator = Validator::make(Input::all(), Post::$rules);

if($validator->passes())
{
$post = new post();
$post->title = $title;
$post->categori_id = Input::get('categori_id');
$post->text = Input::get('text');
$post->slug = str_replace(' ', '-' ,rtrim($title));
$post->author_id = Auth::user()->id;


if($post->save())
{
$mytags = Input::get('tags');
$slug_tag = explode(',',str_replace( ' ', '-' , trim($mytags) ));
$mytags = explode(',',$mytags);
$count = count($slug_tag);

$tag_id = array();
$loop = 0;

while($count > $loop )
{
$tag_find = DB::table('tags')->where('slug_tag', '=' , $slug_tag[$loop] )->first();
if($tag_find)
{
$tag_id[] = $tag_find->id;
}
else
{
$tag = new tag;
$tag->name = $mytags[$loop];
$tag->slug_tag = $slug_tag[$loop];
$tag->save();
$tag_id[] = $tag->id;
}
$loop++;
}

$post->tags()->sync($tag_id);

return Redirect::to('admin/posts')->with('msg', 'خبر با موفقیت درج گردید .');
}
}
return Redirect::to('admin/posts/create')
->with('error', 'خطایی در ثبت خبر بوجود آده است : ')
->withErrors($validator)
->withInput();
}