احسان
3 سال پیش توسط احسان مطرح شد
2 پاسخ

نحوه insert اطلاعات از فرم در روابط چند به چند لاراول

با سلام
من دو جدول categories و users دارم که بینشون رابطه‌ی many to many وجود دارد. حالا در ویوی خودم که قصد دارم یک user رو اضافه کنم، می‌خواهم همونجا هم بتونم از فیلد category، دسته‌های مورد نظرم رو بتونم انتخاب کنم (که این فیلد از جدول categories خوانده میشه) و به سمت کنترلرم پاس بدم و در دیتابیسم موارد ذخیره بشن.
جداول خودم رو هم به درستی ایجاد کردم و مشکلی در این زمینه وجود نداره. فقط در اینکه از طریق فرم (ویو) بتونم ثبت اطلاعات کنم و همزمان علاوه بر ایجاد یک user جدید، در جدول pivot که تعیین کردم برای رابطه‌ی چند به چند، دچار مشکل شدم و نمیدونم چطور باید از طریق save یا attach این کار رو انجام بدم. یعنی باید بتونم userid و categoryid هم در جدول pivot به ثبت برسونم که در حقیقت در آن واحد باید اطلاعاتی در دو جدول users و categoryuser به ثبت برسند.
ممنون میشم اگر راهنمایی کنید یا کدم رو کمی اصلاح کنید که متوجه بشم بقیه موارد را باید به چه صورت طی کنم.

پیشاپیش سپاسگزارم

کدها رو هم اینجا قرار میدم:

ویوی من:

<form action="{{ route('users.store') }}" method="post" enctype="multipart/form-data">
    @csrf

    <input type="text" name="name" value="{{ old('name') }}">

    <input type="text" name="last_name" value="{{ old('last_name') }}">

    <input type="file" name="profile_image">

    <select name="category_id">
        <option value="">دسته</option>
        @foreach ($categories as $category)
        <option value="{{ $category->id }}">{{ $category->title }}</option>
        @endforeach
    </select>

    <button>افزودن</button>
</form>

کنترلر:

public function store(UserCreateRequest $request)
{

    if ($request->hasFile('profile_image')) {

        $imageName = time() . '.' . $request->profile_image->extension();

        User::create([
            'name' => $request['name'],
            'last_name' => $request['last_name'],
            'profile_image' => $imageName,
            'category_id' => $request['category_id'],
        ]);

        $request->profile_image->move(public_path('images'), $imageName);
    } else {

        User::create([
            'name' => $request['name'],
            'last_name' => $request['last_name'],
            'profile_image' => 'nopic.jpg',
            'category_id' => $request['category_id'],
        ]);
    }

    return redirect(route('users.create'))->with('success', 'کاربر با موفقیت افزوده شد');
}

@hesammousavi
@ali.bayat


ثبت پرسش جدید
احسان
تخصص : توسعه دهنده وب
@ehsan99 3 سال پیش مطرح شد
0

ممنون از شما آقای بیات
نهایتاً کاری که کردم به صورت زیر اطلاعات رو در دو جدول insert کردم که کد رو میذارم تا اگر کسی مشکل مشابهی داشت استفاده کنه.


    public function store(UserCreateRequest $request)
    {

        if ($request->hasFile('profile_image')) {

            $imageName = time() . '.' . $request->profile_image->extension();

            $user = User::create([
                'name' => $request['name'],
                'last_name' => $request['last_name'],
                'profile_image' => $imageName,
            ]);

            $user->categories()->attach(request('category_id'));

            $request->profile_image->move(public_path('images'), $imageName);
        } else {
            $user = User::create([
                'name' => $request['name'],
                'last_name' => $request['last_name'],
                'profile_image' => 'nopic.jpg',
            ]);
            $user->categories()->attach(request('category_id'));
        }

    return redirect(route('users.create'))->with('success', 'کاربر با موفقیت افزوده شد');
    }

علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 3 سال پیش آپدیت شد
1

قرار دادن اطلاعات در رابطه‌ی های many to many بسیار ساده ست

شما رابطه رو در هر ۲ سمت داری مثلا

$user->categories
$category->users

از طرفی یک pivot هم داری

حالا وقتی از attach استفاده میکنی، یکی از فیلد ها رو لاراول خودش برات پر میکنه و تنها کافیه اون یکی فیلد رو بهش پاس بدی

مثلا وقتی که user رو داری و از رابطه categories استفاده میکنی، لاراول خودش user_id رو تشخیص میده و کافیه category id رو پاس بدی

$user->categories()->attach($category_id);

احسان
تخصص : توسعه دهنده وب
@ehsan99 3 سال پیش مطرح شد
0

ممنون از شما آقای بیات
نهایتاً کاری که کردم به صورت زیر اطلاعات رو در دو جدول insert کردم که کد رو میذارم تا اگر کسی مشکل مشابهی داشت استفاده کنه.


    public function store(UserCreateRequest $request)
    {

        if ($request->hasFile('profile_image')) {

            $imageName = time() . '.' . $request->profile_image->extension();

            $user = User::create([
                'name' => $request['name'],
                'last_name' => $request['last_name'],
                'profile_image' => $imageName,
            ]);

            $user->categories()->attach(request('category_id'));

            $request->profile_image->move(public_path('images'), $imageName);
        } else {
            $user = User::create([
                'name' => $request['name'],
                'last_name' => $request['last_name'],
                'profile_image' => 'nopic.jpg',
            ]);
            $user->categories()->attach(request('category_id'));
        }

    return redirect(route('users.create'))->with('success', 'کاربر با موفقیت افزوده شد');
    }

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام