如何实例化多对多关系,并更新其列

问题描述 投票:0回答:1

我在产品和用户模型之间存在多对多关系,我正在尝试实例化用户和特定产品之间的一种关系,或者更新它的“favoris”列(如果它已经存在)。

我不确定我是否使用了适当的方法。

<?php

namespace App\Http\Controllers;

use App\Http\Middleware\Authenticate;
use App\Models\Product;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;

class StatisticsController extends Controller
{
    public function favoris(Request $request){
       $user=Auth::user();
       $list_prods_fav_true=[];
        $favs=$request->input('favoris');
        Log::info($favs);
        $list_favoris=collect();
        $list_unfavoris=collect();
          $message='';
          try{
        foreach ($favs as $fav) {
          $prod= $fav['produit'];
        
          try{
            $product=Product::find($prod["id"]);
              if(!$product){
                       $product=Product::create(
                        [
                            'id'=>$prod["id"],
                            'nom'=>$prod["nom"],
                            'description'=>$prod["description"],
                            'img'=>$prod["img"]
                        ]
                        );}
                $nbre_lignes_updated=$user->products()->updateExistingPivot(
                $prod->id,['favoris'=>true]
                           );
                           if($nbre_lignes_updated===0){
                            Log::info('update '.$nbre_lignes_updated);
                            $user->products()->syncWithoutDetaching([$prod->id=>['favoris'=>true]]);
                           }                      
                array_push($list_prods_fav_true,$prod['id']);
                          
                        
                       
                       
                       


            
                }
                catch(Exception $e){
                    $message=$e;
                }
            
                  
            
/* 
            $product->updateExistingPivot($prod['id'],['favoris'=>true]);
            */
            $list_prods_fav_false=$user->products->diff(Product::whereIn('id',$list_prods_fav_true)->get());
           
            foreach($list_prods_fav_false as $prod){
               $nbre_lignes_updated=$user->products()->updateExistingPivot(
                $prod->id,['favoris'=>false]
               );
               if($nbre_lignes_updated===0){
                Log::info('upadte '.$nbre_lignes_updated);
                $user->products()->syncWithoutDetaching([$prod->id=>['favoris'=>false]]);
               }
               else{
                Log::info('update',$nbre_lignes_updated);
               }
            }
            $list_favoris=$user->products()->wherePivot('favoris',true)->get();
            $list_unfavoris=$user->products()->wherePivot('favoris',false)->get();
        
      
        }}
        catch(Exception $e){
            $message=$e;;
        }
       
        return response()->json([
            'message'=>'liste des favoris est bien recue  '. $message,
            'liste des favoris'=>$list_favoris,
            'liste des unfavoris'=>$list_unfavoris,
        ]);
    }
}

结果始终是 list_favoris 的一个空数组,那就是我添加 updateExistingPivot 时,在我仅使用syncWithoutDetaching之前,每次我将一个产品添加到收藏夹时,它都会创建最多 4 个关系对象。

laravel eloquent many-to-many eloquent-relationship
1个回答
0
投票

仍然不知道为什么每次我将一个产品添加到收藏夹时,syncWithoutDetaching 都会创建最多 4 个关系对象。 但是,我在当前代码中遇到的问题 -> 从 $prod 希望恢复 id 的值来自 React 。 我必须尝试使用 $prod['id'] 或 $product->id,而 $product 是一个 php 对象。

© www.soinside.com 2019 - 2024. All rights reserved.