【问题标题】:laravel pivot table uniquelaravel 数据透视表唯一
【发布时间】:2016-12-06 07:51:07
【问题描述】:

order_id....product_id....product_quantity....created_at....updated_at

这是我的数据透视表...在我的 OrderRequest 表中,我想将 product_id 指定为唯一的。但是当我这样写的时候;

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

我遇到了一个问题。 product_id 变得唯一。但不仅顺序,它变得完全独特。我想在其他订单中使用这个 product_id 但我不能。我能做些什么?如何将 product_id 分配为每个 order_id 值的唯一值?

【问题讨论】:

  • 您可以通过编辑数据透视迁移并添加此行 $table->primary(['order_id', 'product_id']); 来实现这一点,如果您愿意,您可以从数据透视表中删除 id 列。并且不要忘记做artisan migrate:refresh !!
  • 没关系,但我需要别的东西。在请求表中,当我两次选择产品时,我应该收到一条错误消息。当我按照您说的尝试时,它不会给我错误消息,只是将同一产品的最后一个选项保存到数据库中。
  • 看看这个post它可以帮助你,如果你需要一些解释,请告诉我:)
  • 我知道那个帖子。但它是不同的。在那个例子中,用户是静态的,但在我的例子中,订单发生了变化。 order_id 在控制器中创建。所以没用
  • 能否详细说明,充分了解您的需求,如何选择产品?在您的控制器中,您会获得所选产品的列表或究竟是什么? ...

标签: php sql laravel


【解决方案1】:

在你的控制器中假设你调用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 变量。

【讨论】:

  • 这符合您的需求吗?
【解决方案2】:

感谢您的帮助。我已经解决了这个问题,它现在可以工作了......

这是我观点的一部分;

<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');
     }

这是我的订单请求;

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!",

【讨论】:

    猜你喜欢
    • 2017-05-17
    • 2021-06-11
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 2021-02-06
    • 2017-12-15
    相关资源
    最近更新 更多