簡體   English   中英

如何在laravel5中獲取另一個表的列數據?

[英]How to get column data of another table in 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
        );
    }

它以“列”和“排序文本”作為參數。 並根據“文章”表中輸入的排序返回url。

前任)

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

我想添加一個“投票”排序。

但是“投票”數據列在另一個表“投票”中。 (“向上”欄)

我想從另一個表中使用這個用戶函數。

前任)

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)

[添加] *文章控制器.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'));
}

請檢查我的答案。 我認為這個例子可以幫助你解決你的問題。

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表選擇字段中。 通過使用它,一個新字段將與其他字段一起使用。 您可以在該字段上添加排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM