2017-10-04 1 views
1

まず、貧しい私の英語を謝っています。laravel5で別のテーブルの列データを取得する方法は?

私はページリストを並べ替えるコードを書いています。 "link_for_sort"はユーザ機能です。

function link_for_sort($column, $text, $params = []) 
    { 
     $direction = request()->input('order'); 
     $reverse = ($direction == 'desc') ? 'asc' : 'desc'; 

     if (request()->input('sort') == $column) { 
      // Update passed $text var, only if it is active sort 
      $text = sprintf(
       "%s %s", 
       $direction == 'desc' 
        ? '<i class="fa fa-sort-alpha-desc"></i>' 
        : '<i class="fa fa-sort-alpha-asc"></i>', 
       $text 
      ); 
     } 

     $queryString = http_build_query(array_merge(
      request()->except(['sort', 'order']), 
      ['sort' => $column, 'order' => $reverse], 
      $params 
     )); 

     return sprintf(
      '<a href="%s?%s">%s</a>', 
      urldecode(request()->url()), 
      $queryString, 
      $text 
     ); 
    } 

"列"と "並べ替えのテキスト"を引数にとります。 そして、「article」テーブルの入力ソートに基づいてURLを返します。

EX)

link_for_sort ("view_count", "view"); 
       -> example.com/post?sort=view_count&order=desc 

私は "投票" の並べ替えを追加したいと思います。

しかし、 "vote"データ列は別のテーブル "votes"にあります。 (上の列)

このユーザー関数を別のテーブルから使いたいです。

EX)

link_for_sort ("up", "vote"); 
     -> example.com/post?sort=up&order=desc 

私はあなたのアドバイスをいただければ幸いです。ありがとうございました。

*project.php 

'sorting' => [ 
    'view_count' => 'view', 
    'created_at' => 'date', 
], 

'sorting_vote' => [ 
    'up' => 'vote', 
], 


*index.blade.php 

<div class="btn-group sort__article"> 
    <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> 
    <i class="fa fa-sort"></i> 
    {{ trans('forum.articles.sort') }} 
    <span class="caret"></span> 
    </button> 

    <ul class="dropdown-menu" role="menu"> 
    // table: article, column: view_count,created_at 
    @foreach(config('project.sorting') as $column => $text) 
     <li {!! request()->input('sort') == $column ? 'class="active"' : '' !!}> 
     {!! link_for_sort($column, $text) !!} 
     </li> 
    @endforeach 

    // table: votes, column: up 
    @foreach(config('project.sorting_vote') as $column => $text) 
     <li {!! request()->input('sort') == $column ? 'class="active"' : '' !!}> 
     {!! link_for_sort($column, $text) !!} 
     </li> 
    @endforeach 
    </ul> 
</div> 


*Article.php 

public function votes() 
{ 
    return $this->hasMany(Vote::class); 
} 


MariaDB> desc articles; 
+------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+------------+------------------+------+-----+---------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| user_id | int(10) unsigned | NO | MUL | NULL |    | 
| title  | varchar(191)  | NO | MUL | NULL |    | 
| content | text    | NO |  | NULL |    | 
| created_at | timestamp  | YES |  | NULL |    | 
| updated_at | timestamp  | YES |  | NULL |    | 
| thumbnail | varchar(191)  | YES |  | NULL |    | 
| view_count | int(10)   | NO |  | 0  |    | 
| popular | int(10)   | NO |  | 0  |    | 
+------------+------------------+------+-----+---------+----------------+ 
9 rows in set (0.00 sec) 

MariaDB> desc votes; 
+------------+------------------+------+-----+-------------------+-----------------------------+ 
| Field  | Type    | Null | Key | Default   | Extra      | 
+------------+------------------+------+-----+-------------------+-----------------------------+ 
| id   | int(10) unsigned | NO | PRI | NULL    | auto_increment    | 
| user_id | int(10) unsigned | NO | MUL | NULL    |        | 
| article_id | int(10) unsigned | NO | MUL | NULL    |        | 
| up   | int(10)   | NO |  | 0     |        | 
| down  | tinyint(4)  | YES |  | NULL    |        | 
| voted_at | timestamp  | NO |  | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | 
+------------+------------------+------+-----+-------------------+-----------------------------+ 
6 rows in set (0.00 sec) 

[追加] * ArticleController.php

public function index(Request $request, $slug = null) 
{ 
    $upVoteQuery = "(select count(id) from votes where votes.article_id=articles.id and votes.up!=0) as up"; 
    $sortField = $request->input('sort', 'id'); 
    $sortDir = $request->input('order', 'ASC'); 
    $builder = new \App\Article; 
    $builder = $builder->selectRaw("articles.*, $upVoteQuery") 
        ->orderBy($sortField, $sortDir) 
        ->get(); 

    dd($builder); 
    $query = $slug 
     ? \App\Tag::whereSlug($slug)->firstOrFail()->articles() 
     : new \App\Article; 

    $query = $query->orderBy(
     $request->input('sort', 'created_at'), 
     $request->input('order', 'desc') 
    ); 

    if ($keyword = request()->input('q')) { 
     #dd($keyword); 
     $raw = 'MATCH(title,content) AGAINST(? IN BOOLEAN MODE)'; 
     $query = $query->whereRaw($raw, [$this->fullTextWildcards($keyword)]); 
    } 
    dd($query); 
    $articles = $query->latest()->paginate(32); 

    return view('articles.index',compact('articles')); 
} 
+0

ソート用テーブルとソート用テーブルの関係を設定しましたか?できるだけテーブルフィールドを表示することができますか? –

答えて

1

私の答えを確認してください。私はこの例があなたの問題を解決するのに役立つかもしれないと思います。上記の例では

function functionName(Request $request) { 

    $upVoteQuery = "(select count(id) from votes where votes.article_id=articles.id and votes.up!=0) as up" 
    $sortField = $request->input('sort', 'id'); 
    $sortDir = $request->input('order', 'ASC'); 
    $builder = new Article; 
    $builder = $builder->selectRaw("articles.*, $upVoteQuery") 
        ->orderBy($sortField, $sortDir) 
        ->get(); 
} 

は、私は、リレーショナルテーブルvotes数を追加するために、クエリを追加し、articlesテーブル選択フィールドに追加しました。これを使うことで、新しいフィールドは他のフィールドと一緒になります。また、そのフィールドにソートを追加することもできます。

+0

ごめんなさい。オーダー→オーダーバイ? – User8392

+0

私はそれをそっとした。ありがとう! – User8392

関連する問題