2016-11-24 11 views
0

APIを使用して製品が更新されるクエリを作成しようとしています。このアプリケーションは、NodeJSレイヤーにラップされたAngular2で構築されています。Laravel Eloquentリレーションシップクエリが機能しない

製品には、ファイルとの多対多の関係があります。私は、データをAPIに送信してファイルを更新するとき、Eloquentクエリーがこの関係がすでに存在するかどうかをチェックし、そうでない場合は、 'file_product'テーブルに関係を追加するということです。私はこの機能をカテゴリ多対多の関係でうまく動作させていますが、なんらかの理由でこれはファイルの関係に作用しません。ここに私のコードです:

プロダクトコントローラー更新機能:

public function update(Request $request, $id) 
    { 
     if($id && is_numeric($id)) { 
      try { 
       $requestProductVars = $request->get('product'); 
       $product = Product::find($id); 
       $product->title = $requestProductVars['title']; 
       $product->description = $requestProductVars['description']; 
       $product->images = json_encode($requestProductVars['images']); 
       $product->SKU = $requestProductVars['SKU']; 
       $product->manufacturer_id = $requestProductVars['manufacturer_id']; 
       $product->active = (($requestProductVars['active'] === true) ? '1' : '0'); 
       if($request->get('categories')) { 
        $categories = $request->get('categories'); 
        foreach($categories as $categoryId) { 
         $category = Category::find($categoryId); 
         if(!$product->categories->contains($category)) { 
          $product->categories()->save($category); 
         } 
        } 
       } 
       if(count($requestProductVars['files'])) { 
        $files = $requestProductVars['files']; 
        foreach($files as $file) { 
         $fileId = $file['id']; 
         $fileRecord = File::find($fileId); 
         if(!$product->files->contains($fileRecord)) { 
          $product->files()->save($fileRecord); 
         } 

        } 
       } 
       $product->save(); 

は、あなたが見ることができるように、私はリクエストに応じて「ファイル」プロパティがあるかどうかをチェックして、私のループは、各ファイルを介して存在する場合idを取得し、関係が存在するかどうかを確認する:

if(!$product->files->contains($fileRecord)) { 

filesプロパティには、Fileオブジェクトの配列が含まれています。

私のコードはここで停止しているようで、実行さえしていないようです。カテゴリ機能はこのコードでうまく動作しますが、これは奇妙です。私はここで全く同じことをやっています。

私は、製品およびファイルのためのモデルをチェックし、多対多の関係は、罰金、ここで定義されています。

Product.php 

/** 
    * Returns all files associated with a product 
    * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany 
    */ 
    public function files() { 
     return $this->belongsToMany('App\File')->withTimestamps(); 
    } 

File.php

/** 
    * Returns all products related to a file 
    * 
    * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany 
    */ 
    public function products() { 
     return $this->belongsToMany('App\Product')->withTimestamps(); 
    } 

私のコードは、「doesnの理由誰もが見ることができますtは働いているようですか?

ありがとう

答えて

0

私は問題が何かを発見しました。

私はファイルを製品の機能に抽象化する前に、製品テーブルに「ファイル」というセルがありました。私はこのセルを削除するのを忘れていましたが、これはファイル関係を照会しようとしたときに競合を引き起こしていました。これは将来誰かを助けてくれることを願っています。