0

私は3つのテーブルのユーザ、記事、メタがあります。私は、laravel 5.3の文書に従ってmorphTo()とmorphToMany()を定義していました。メタ名表に定義されているユーザーまたは記事の特定のプロパティを、firstnameやlastname、coordinateなどの任意のプロパティから取得できます。metable型のララベルメタテーブルのデータを検索

これらのプロパティを検索するための正しいモデルを作成するのが難しくなりました。たとえば、ユーザーの姓や名字、またはその両方を検索することができません。

<u>User table</u> 
id. username. password 
1.  Test.    Testpass 

<u>article</> 
id. Title.      Slug 
1.  My article title. my-article-title 

メタ情報テーブル

Id.  key.    value.     metable_id metable_type 
1  firstname  Ade      1      App\User 
2.  content.  Sample article 1.      App\Article 
3.  lastname.  Keon.     1.     App\User 

Meta.phpは

public function metable() { 
    return $this->morphTo(); 
} 

User.phpが

public function meta() { 
    return $this->morphToMany('App\User', 'metable'); 
} 

public function getName() { 
    $user = User::find($this->id); 
    $metadata = $user->meta()->whereIn('key', ['firstname', 'lastname']) ; 
    dd($metadata); 
} 

Article.phpが抽出抽出抽出

予想通り
public function meta() { 
    return $this->morphToMany('App\User', 'metable'); 
} 

のgetName機能が働いていたが、私は

いけない知って参加し、従来のPHP/MySQLのテーブルとは異なり、ユーザメタデータの検索を行う方法を見つけ出すことはできませんどのようにlaravel全体多型の関係があるよう私はJOIする方法を参照するか、その理由カント

public function getSearch() { 
     return User::with(array('metas' => function($query) { 
      $query->where('value', $query); 
     })); 
} 

または

public function getSearch() { 
     return User::with('metas') 
     ->whereHas('metas', function($query) { 
       $query->where('value', '=', $query); 
      }); 
    } 

:私は私に新しいしかし、これらのようなものを発見し、使用しましたnはここlaravel

の表では、上記の貢献のための

public function getResults(Request $request) { 
    $keyword = $request->input('query'); 
    $filterOne = $request->input('minAge'); 
    $filterTwo = $request->input('maxAge'); 

    $query = User::with(['meta' => function ($q) { 
     $q->where('value', 'like', $keyword) 
      ->orWhere(function ($q) { 
       $q->whereBetween('value', [$filterOne,$filtertwo]); 
      }); 
    }])->get(); 

dd($query); 
} 
+0

何を試したのか、何がうまくいかないのかを説明してください。 – TheFallen

+0

データベーススキーマと関係を表示します。 –

+0

@ TheFallen – adeguk

答えて

0

おかげで、これの不足が実際の測定値との考え方に強く私をプッシュする私の新しい検索クエリで、私は最終的に機能クエリにuse()に出くわしました以下に示すように。

public function getResults(Request $request) { 
     $keyword = $request->input('query'); 
     $filterOne = $request->input('minAge'); 
     $filterTwo = $request->input('maxAge'); 

     if (isset($keyword)) { 
      $query = User::with(['meta' => function ($q) use ($keyword,$filterOne,$filterTwo) { 
       $q->where('value', 'LIKE', $keyword) 
        ->whereBetween('value', [$filterOne, $filterTwo]); 
      }])->get(); 
     } else { 
      $query = User::with(['meta' => function ($q) use ($filterOne,$filterTwo) { 
       $q->whereBetween('value', [$filterOne, $filterTwo]); 
      }])->get(); 
     } 

     dd($query); 
    } 

これは私に探している結果です。大規模なデータセットを扱うときのパフォーマンスへの影響は確かではありませんが、それが私の次の割り当てだと思います。

関連する問題