رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
ارتباط بین جداول many to many
#1
سلام
میشه به این مشکل من جواب بدید؟
دو تا جدول user , book دارم که ارتباط چند به چند رو باuser_book برقرار کردم.حالا می خوام وقتی کاربر می خواهد کتابی را ثبت کند user_id هم با مقدار id کاربر پر شود.
bookmodel:
کد:
class Book extends Model
{
    protected $fillable = [
        'title','subject','translator','writer','b_file','summary','confirmed',
    ];
    public $guarded = ['id' , 'user_id'];
    public function users(){
        return $this->belongsToMany('App\User');
    }
}
usermodel:
کد:
class User extends Authenticatable
{
    protected $fillable = [
        'username', 'email','password'
    ];

    protected $hidden = [
         'password','remember_token',
    ];
    public $guarded = ['id' , 'book_id'];
    public function books(){
        return $this->belongsToMany('App\Book');
    }
}
bookcontroller:
کد:
$input_writer=Request::get('writer');
        $input_summary=Request::get('summary');
        $input_translator=Request::get('translator');
        $input_b_file= Request::file('b_file');
        $book_fileName = time() . '_' . $input_b_file->getClientOriginalName();
        $destinationPath = public_path() . '/uploads';
        $input_b_file->move($destinationPath, $book_fileName);
//        $id=DB::table('users')->where('username','=',session('name'))->select('id')->get();
        Book::create([
            'title'=>$input_title,
            'subject'=>$input_subject,
            'writer'=>$input_writer,
            'summary'=>$input_summary,
            'b_file'=>$book_fileName,
            'translator'=>$input_translator,
            'confirmed' => '0',
//            'user_id'=>$id,
        ]);
        return redirect('/');
    }
ایا باید خودم دستی id یوزر رو پیدا کنم و توی جدول کتاب ها ذخیره کنم؟ اگه نه. لطفا توضیح بدید چکار کنم.
پاسخ
#2
سلام

اگر ارتباط شما چند به چند هست که نباید آیدی یوزر (احتمالا منظورتون همون نویسنده های یک کتابه) رو داخل جدول کتابها ذخیره کنید چون تو این حالت یک کتاب میتونه چندین کاربر بهش متصل باشن و باید یک جدول واسط به اسم book_user تعریف کنید و سپس book_id و user_id رو داخلش تعریف کنید.

بعدش موقعی که می خواهید فرم براس ساخت کتاب درست کنید باید یک dropdown list درست کنید که بشه لیست نویسنده های کتاب مورد نظرو بهش داد که در واقع id هاشو میگیره و بعد از ثبت کتاب باید اونو attach کنید اینحا من یک مثال کار کردم میتونید بخونید و ایده بگیرید
http://forum.ncis.ir/Thread-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AC%D8%A7%D9%85%D8%B9-Laravel?pid=8953#pid8953
پاسخ
#3
Photo 
(10-04-2016, 02:35 PM)hamo نوشته:  سلام

اگر ارتباط شما چند به چند هست که نباید آیدی یوزر (احتمالا منظورتون همون نویسنده های یک کتابه) رو داخل جدول کتابها ذخیره کنید چون تو این حالت یک کتاب میتونه چندین کاربر بهش متصل باشن و باید یک جدول واسط به اسم book_user تعریف کنید و سپس book_id و user_id رو داخلش تعریف کنید.

بعدش موقعی که می خواهید فرم براس ساخت کتاب درست کنید باید یک dropdown list درست کنید که بشه لیست نویسنده های کتاب مورد نظرو بهش داد که در واقع id هاشو میگیره و بعد از ثبت کتاب باید اونو attach کنید اینحا من یک مثال کار کردم میتونید بخونید و ایده بگیرید
http://forum.ncis.ir/Thread-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AC%D8%A7%D9%85%D8%B9-Laravel?pid=8953#pid8953
ممنونم از راهنماییتون خیلی کمکم کرد فقط این قسمت رو نمی فهمم:
کد:
$post->tags()->attach($request->tags);
کد:
متد attach یک آرایه از id تگ های انتخاب شده رو به عنوان پارامتر دریافت می کند.
من داخل کنترولر کاربر ورودی ها رو تک تک گرفتم بخاطرتگ  select ای که داشتم:
کد:
public function Register_new_book(){
       $input_title= Request::get('title');
       $input_subject= Request::get('subject');
       if($input_subject ==='1'){
           $input_subject='مذهبی';
       }elseif($input_subject === '2'){
           $input_subject='تاریخی';
       }elseif($input_subject === '3'){
           $input_subject='جغرافیا';
       }elseif($input_subject === '4'){
           $input_subject= 'علوم پایه';
       }elseif($input_subject === '5'){
           $input_subject ='علوم مهندسی';
       }elseif($input_subject === '6'){
           $input_subject ='علوم پزشکی';
       }elseif($input_subject === '7'){
           $input_subject = 'رمان و داستان';
       }else{
           $input_subject ='';
       }
       $input_writer=Request::get('writer');
       $input_summary=Request::get('summary');
       $input_translator=Request::get('translator');
       $input_b_file= Request::file('b_file');
       $book_fileName = time() . '_' . $input_b_file->getClientOriginalName();
       $destinationPath = public_path() . '/uploads';
       $input_b_file->move($destinationPath, $book_fileName);
     $book = Book::create([
           'title'=>$input_title,
           'subject'=>$input_subject,
           'writer'=>$input_writer,
           'summary'=>$input_summary,
           'b_file'=>$book_fileName,
           'translator'=>$input_translator,
           'confirmed' => '0',
       ]);
      $book->users()->attach($user_id);
       return redirect('/');
   }
توی قسمت attach باید چی کارکنم?من واقعا گیج شدم از یه سایتی خوندم که باید توی attach, $user_id بنویسم ولی اونم خطا داره.لطفا راهنمایی کنیدHuh
پاسخ
#4
ببینید وقتی یک route برای نمایش فرم درست کردم همراهش لیست تگ ها رو هم فرستادم بعد توی فرم اومدم یه تگ select باز کردم با foreach تگ هارو نشون دادم خب کاربر میاد چندتا تگ رو انتخاب میکنه اسم این لیست رو گزاشته بودم tags[] که بعد اومدم توی attach همونارو که Id های اون تگ هستن قرار میدم شما مثل اینکه از فصاد استفاده میکنید پس باید اینجوری بنویسید:

کد پی‌اچ‌پی:
$book->users()->attach(Request::input('users'); 

البته باید توی فرم طبق مثال من انجام بدین فقط فرق مثال من با شما توی کلاس User با Tag هست کافیه اسماشونو باهم عوض کنید اون قسمت درج کردن رو بخونید متوجه میشید
پاسخ
#5
باید همه کدهایی که نوشتین رو قرار بدین تا بررسی بشه
پاسخ
#6
اینارو که باز میکنی هرکدوم 500 خط کد دارن منظور من فقط کدهایی که برای این منظور نوشتی رو توی تگ php همین سایت قرار بدین

1-روت هایی که تعریف کردین
2-فرمی که برای درج کتاب نوشتین
3-کنترلر و اکشنی که برای درج کتاب نوشتین

همین 3 مورد نیاز به اینهمه شلوغ کاری نبود Big Grin
پاسخ
#7
کلا منطق برنامتون اشتباهه شما اصلا User ایی توی فرم نمیگیرید که بخواهید attach کنید فکر میکنم شما می خواهید کاربری که کتاب رو ثبت کرده رو هم تو دیتابیس ثبت کنید که این رابطه یک به چنده در کل باید از اول بشینید و یه تحلیل بکنید اصلا چی می خواهید و روابطتون به چه صورت هست بعد پیاده سازی و کدنویسیش خیلی راحته
پاسخ
#8
سلام
ممنون از راهنمایی های شما
اگه بخوام بین جدول هایی که رابطه چند به چند دارن ، Join انجام بدم چطوری باید بنویسم ؟
جدول های یوزر و کتاب رابطه many-to-many دارن.مثلا:
کد:
 $search=DB::table('books')
                               ->join('users','books.user_id','=','users.id')
                               ->where('books.summary','=',$input_summary)
                               ->get();
پاسخ
#9
(10-09-2016, 12:27 PM)زهرا نوشته:  سلام
ممنون از راهنمایی های شما
اگه بخوام بین جدول هایی که رابطه چند به چند دارن ، Join انجام بدم چطوری باید بنویسم ؟
جدول های یوزر و کتاب رابطه many-to-many دارن.مثلا:

کد:
 $search=DB::table('books')
                               ->join('users','books.user_id','=','users.id')
                               ->where('books.summary','=',$input_summary)
                               ->get();

جوابش رو می زارم شاید بدرد کسی بخوره:
سه تا جدول داشتم users,books,book_user که رابطه چند به چند دارن، حالا اگه بخواییم بین اینها join انجام بشه یه نمونش میشه این:
کد:
$search=DB::table('books')
                                ->join('book_user','books.id','=','book_user.book_id')
                                ->join('users','book_user.user_id','=','users.id')
                                ->where('books.subject','=',$input_subject)
                                ->where('books.translator','=',$input_translator)
                                ->get();
پاسخ
 


موضوعات مشابه ...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  ارتباط model با migration ebibombas1988 1 56 08-06-2016, 06:33 AM
آخرین ارسال: hamo
  ارتباط یک جدول با چند جدول delete 0 264 09-05-2015, 04:38 PM
آخرین ارسال: delete
  درخواست راهنمايي براي طراحی جداول دیتابیس Webdeveloper 1 241 07-11-2015, 03:44 PM
آخرین ارسال: peyman
  آموزش Relationships جداول در لاراول 5 alihossein 9 1,172 07-11-2015, 01:06 PM
آخرین ارسال: Webdeveloper

پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان

درباره انجمن فریم ورک لاراول

انجمن لاراولیستا به عشق توسعه دهنده ها و علاقمندان به این فریم ورک محبوب ایجاد شده و امیدواریم با نظرات خوبتون ما رو در بهبود کار یاری کنید. در ضمن خیلی هم خوشحال میشیم شما هم در توسعه این انجمن سهمی داشته باشید.