2016-08-01 2 views
1

order_id .... product_id .... product_quantity .... created_at .... updated_atLaravel сводной таблицы уникальный

это моя сводная таблица ... В моей OrderRequest таблице я хочу назначить product_id, как уникальный. Но когда я пишу так;

public function rules() 
    {    
     return [ 
       'product_id' => 'unique:order_product,product_id' 
       ]; 
    } 

У меня возникли проблемы. product_id становится уникальным. но не только в порядке, он становится совершенно уникальным. Я хочу использовать этот product_id в других заказах, но я не могу. что я могу сделать? Как я могу присвоить product_id уникальным для каждого значения order_id?

+0

Вы можете acheave это с редактированием миграции поворотную и добавьте эту строку '$ стол-> первичный ([«ORDER_ID»,«product_id»]);' и если вы хотите, вы можете удалить 'id' столбец из сводной таблицы. И не забудьте сделать 'artisan migrate: refresh' !! – Maraboc

+0

это нормально, но мне нужно что-то еще. В форме запроса, когда я дважды выбираю продукт, я должен получить сообщение об ошибке. Когда я пытаюсь, как вы сказали, он не дает мне сообщение об ошибке, просто сохраняет последний вариант того же продукта в базе данных. –

+0

Взгляните на это [сообщение] (http://stackoverflow.com/questions/32199441/unique-name-rule-validation-based-on-pivot-table-laravel), это может помочь вам, сообщите мне, если вы нужны некоторые эксцессы :) – Maraboc

ответ

0

Благодарим за помощь. Я закончил выпуск и сейчас работает ...

Это часть моего мнения;

<div class="grid1"> 
    {!! Form::label('product_list'.$product_row, Lang::get('home.Select Product')) !!}   
</div> 
<div class="grid2 searchDrop"> 
    {!! Form::select('product_list[]', $product_list, null, ['style'=>'width:150px;'])!!} 

и это является частью моего контроллера;

public function store(OrderRequest $request) 
    { 
     $order = Order::create($request->all()); 

     $product_list= $request->input('product_list'); 
     $product_quantity = $request->input('product_quantity'); 
     $product_status = $request->input('product_status'); 

      /* attach pivot table */ 
     $order->product()->attach($product_list); 

     /* get the product list as array */    
     foreach($product_list as $key => $product_id) 
     { 
     $order->product()->updateExistingPivot($product_id, array(
         'product_quantity' => $product_quantity[$key], // product_quantity is array 
         'product_status' => $product_status[$key], // product_status is array 
         'updated_at' => Carbon::now() 
         )); 
     }    

      flash(Lang::get('home.The order has been created!')); 
     return redirect(url('/admin/orders/details',$order->id))->with('flash_message'); 
    } 

это мой запросRequest;

public function rules() 
    { 
     return [ 
      'customer_id' => 'required', 
      'product_quantity.*' =>'not_in:0', 
      'product_list' => 'product_unique', //custom validation in AppServiceProvider 
     ]; 
    } 

и это мой AppServiceProvider;

public function boot() 
    { 
     Validator::extend('product_unique', function($attribute, $value, $parameters, $validator) { 
       if (count(array_unique($value))!=count($value)) { 
        return false; 
       } 
      return true; 
     }); 
    } 

Наконец, в моем validation.php я добавил;

"product_unique" => "Please select a product only once!", 
0

В контроллере при условии, что вы называете saveProducts метод так:

function saveProducts($request){ 
    validateProductList($request->input('product_list')) 
    $order->product() 
      ->updateExistingPivot($product_id[$i], 
       array( 
        'product_quantity' => $product_quantity[$i], 
        'product_status' => $product_status[$i], 
        'updated_at' => Carbon::now())); 
    // .... 
} 

function validateProductList($productIds){ 
    if(isProductIdDuplicated($productIds)){ 
     $error = 'You have a duplicated product in your Order, please edit it' 
     return redirectBack()-withError(); 
    } 
} 

function isProductIdDuplicated($productIds){ 
    $occureces_array = productIds(); 
    foreach($productIds as $id){ 
     if(++$occureces_array[$id] > 1){ 
      return true; 
     } 
    } 
    return false; 
} 

А по вашему мнению, у вас есть доступ к этой переменной $error.

+0

благодарим вас за совет. –

+0

Это отвечает вашим потребностям? – Maraboc

+0

Я пытаюсь сделать –

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