Laravel 5.7 - Присоединение сводной таблицы ()

Я не могу заставить attach() работать в моей системе.

Каждый User может иметь много Order, у которых может быть много Product.

User.php

    public function orders()
{
    return $this->hasMany(Order::class);
}

Order.php

    public function users()
{
    return $this->belongsTo(User::class);
}

    public function products()
{
    return $this->belongsToMany(Product::class)
                ->withTimestamps()
                ->withPivot('qty');
}

Product.php

    public function orders()
{
    return $this->belongsToMany(Order::class)
                ->withTimestamps()
                ->withPivot('qty');
}

У меня есть create.blade.php, который предназначен для отображения всех доступных продуктов, и количество для каждого может быть выбрано, это должно быть сохранено в сводной таблице.

create.blade.php

{{ Form::open(array('url' => '/orders/store')) }}

@foreach ($products as $product)
    <div>
        <span class = "mealname">{{ $product->name }}</span>
        <hr>
        <p>{{ $product->description }}</p>
    </div>

    <div class = "qty">
        {{ Form::text( 'qty', 0, [ 'type' => 'tel' ]) }}
    </div>
@endforeach

{{ Form::select('delivery_day', ['M' => 'Monday', 'W' => 'Wednesday'],
    null, ['placeholder' => 'Delivery Day'])
}}
{{ Form::submit('Place Order') }}
{{ Form::close() }}

Когда я отправляю запрос, сохраняются только поля в таблице Order,

public function store(Request $request)
{
    // Validate
    $request->validate([
        'qty'=> 'integer',
      ]);

  # Create New Order
    $order = new Order;
    $id = Auth::user()->id;
    $order->user_id = $id;

     // passed in parameters of form (not qty)

    auth()->user()->orders()->save($order); // save order

  # Pivot attach()

    HERE I AM LOST

    return redirect('complete')->with('success', 'Order has been created');
}

Я считаю, что это тот факт, что я пытаюсь передать несколько продуктов в одной форме (которую, как я считаю, я могу просто передать как arry, пока я использую attach().

Я пробовал различные решения, и мне все еще не удалось заполнить сводную таблицу.

Моя последняя попытка заключалась в том, чтобы пропустить product_id через скрытое поле, а затем запустить это.

    $attach_data = [];
    for ($i = 0; $i < count($product_ids); $i++);
    $attach_data[$product_ids[$i]] = ['qty' => $qtys[$i]];

    $order->product_ids()->attach($attach_data);

Однако это не сработало.

Как вы пробовали использовать attach()? Можете ли вы добавить код к вашему вопросу?

newUserName02 05.12.2018 20:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
2
1
2 816
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно документации (https://laravel.com/docs/5.7/eloquent-relationships#updating-many-to-many-relationships), это один из способов прикрепить несколько элементов:

$user->roles()->attach([
  1 => ['expires' => $expires],
  2 => ['expires' => $expires]
]);

Итак, вам нужно изменить это:

# Create New Order
$order = new Order;
$id = Auth::user()->id;
$order->user_id = $id;
$order->save();

// change this for your array of ids
$products_to_sync_ids = [1,3,23];

$sync_data = [];
$qty = 1; <----- I dont know if you are inserting them with the same qty
for($i = 0; $i < count($products_to_sync_ids); $i++))
   $sync_data[$products_to_sync_ids[$i]] = ['qty' => $qty];

$order->products()->sync($sync_data);

Попробуйте проверить, правильно ли вставляются продукты в сводную таблицу, а затем измените код, чтобы вставить каждый код с его количеством.

Я был на удивление близок, надеюсь, это поможет другим.

sgt_disco 05.12.2018 21:21

Другие вопросы по теме