2017-01-05 3 views
2

Case
Laravel 5,3Удалять/разделите первый поворотный стол записи

Имея сводную таблицу между Cart & Product с дополнительным столбцом:

id - cart_id - product_id - item_id (additional column) 
1 - 1 -  1  - 5 
2 - 1 -  1  - 6 
3 - 1 -  1  - 7 
4 - 2 -  1  - 8 

Обычно отделяться запись сводной таблицы используя:
$product->carts()->detach($cartId);

Но в этом случае, есть несколько сводных таблиц записей с одинаковым cart & productid

Проблема

позволяет сказать, что я хочу удалить, чтобы row 1.

То, что я надеялся на работу был либо один из них:
$product->carts()->detach($itemId);
или
$product->carts()->detach($cartId)->first();

Если я запрашиваю сводную таблицу на основе cart_id & product_id, вызовите first & запустить delete() на этот результат запроса a Call to undefined method stdClass::delete() будет возвращен

$firstItem = DB::table('cart_product') 
    ->where('cart_id', $cart_id) 
    ->where('product_id', $product->id) 
    ->first();  

$firstItem->delete(); 

Хотя, когда я dd()$firstItem после запроса данных, он будет возвращать (правильный) объект

{#238 ▼ 
    +"id": 1 
    +"cart_id": 1 
    +"product_id": 1 
    +"item_id": 5 
} 
+0

Из моего понимания и опыта '$ продукт-> тележки() -> detach ($ itemId); 'должен работать. Какая ошибка вы получаете? – devk

+0

@devk посмотреть ближе. '$ itemId' является идентификатором дополнительного столбца, но не' cart_id'. –

+0

@AlexeyMezenin О, я вижу. Не следует ли '$ product-> carts() -> где ('cart_product.item_id', $ itemId) -> detach()' работать хотя? Предполагая, что существует '-> withPivot (['item_id'])' в отношении. – devk

ответ

1

Вы не можете использовать detach(), если вы хотите удалить только одну строку в этой таблице.

Если вы хотите удалить только первый элемент, просто используйте:

DB::table('cart_product') 
    ->where('cart_id', $cart_id) 
    ->where('product_id', $product->id) 
    ->take(1) 
    ->delete(); 

Или из вашего кода:

$id = DB::table('cart_product') 
    ->where('cart_id', $cart_id) 
    ->where('product_id', $product->id) 
    ->first()->id; 

DB::table('cart_product') 
    ->where('id', $id) 
    ->delete(); 
+0

Это приводит к вызову undefined method stdClass :: delete() – Liam

+0

Вы уверены, что не используете 'first()', 'find()' или что-то еще? Поскольку [синтаксис верен] (https://laravel.com/docs/5.3/queries#deletes) –

+0

Итак, вы обновили свой вопрос, и вы добавили 'first()' в мой код. Удалите его, просто используйте код из моего ответа без изменений. –

Смежные вопросы