Я не могу заставить 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);
Однако это не сработало.






Согласно документации (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);
Попробуйте проверить, правильно ли вставляются продукты в сводную таблицу, а затем измените код, чтобы вставить каждый код с его количеством.
Я был на удивление близок, надеюсь, это поможет другим.
Как вы пробовали использовать
attach()? Можете ли вы добавить код к вашему вопросу?