2017-10-04 24 views
1

Zuerst entschuldige ich mich für mein schlechtes Englisch.Wie erhalten Sie Spaltendaten einer anderen Tabelle in Laravel5?

Ich schreibe Code, um die Seitenliste zu sortieren. "link_for_sort" ist eine Benutzerfunktion.

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

Es dauert "Spalte" und "Text sortieren" als Argumente. Und gibt die URL basierend auf der eingegebenen Sortierung in der Tabelle "article" zurück.

ex)

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

Ich möchte eine "Stimme" Art hinzuzufügen.

Aber "Abstimmung" Daten Spalte ist in einer anderen Tabelle "Stimmen". (die "up" -Spalte)

Ich möchte diese Benutzerfunktion aus einer anderen Tabelle verwenden.

ex)

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

würde ich Ihren Rat zu schätzen wissen. Vielen Dank.

*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) 

[hinzufügen] * 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

Haben Sie die Beziehung zwischen den Tabellen sorting und sorting_vote festgelegt? Können Sie uns Tabellenfelder zeigen, wenn möglich, bitte –

Antwort

1

Bitte meine Antwort überprüfen. Ich denke, dieses Beispiel kann Ihnen helfen, Ihr Problem zu lösen.

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

In obigem Beispiel habe ich eine Abfrage votes Zählung relationalen Tabelle hinzuzufügen und hinzugefügt in articles Tabelle Auswahlfelder. Dadurch wird ein neues Feld mit anderen Feldern erhalten. Und Sie können die Sortierung für dieses Feld hinzufügen.

+0

Entschuldigung. Bestellung -> Bestellungvon? – User8392

+0

Ich habe es gewühlt. Vielen Dank! – User8392

Verwandte Themen