Сортировка столбцов путем объединения двух таблиц в Laravel - PullRequest
0 голосов
/ 12 апреля 2020

У меня две таблицы книг и издательств. publisher_id - это первичный ключ в таблице издателей и внешний ключ в таблице книг. В index.blade. php книг я хочу создать ссылку для сортировки столбцов книжного индекса. вот моя часть index.blade. php просмотр, где я создаю ссылки.

<table class="table">
        <tr>
            <th><a href="{{ route('books-index',['sort' => 'name','direction' => 'asc']) }}">Name</a></th>
            <th><a href="{{ route('books-index',['sort' => 'published_date','direction' => 'asc']) }}">Published Date</a></th>
            <th><a href="{{ route('books-index',['sort' => 'publisher_name','direction' => 'asc']) }}">Publisher Name</a></th>
            <th>Category</th>
            <th>Author</th>

А в BooksController. php, у меня есть метод индекса, в котором часть сортировки приведена ниже

public function index(Request $request) {
        $input = $request->all();
        $sort = 'created_at';
        $direction = 'desc';
        if(isset($input['sort'])){
            $sort = $input['sort'];
        }
        if(isset($input['direction'])){
            $direction = $input['direction'];
        }

        $books = Book::join('publishers','publishers.id','books.publisher_id')
                ->orderby($sort,$direction)->select('books.*')->paginate(5);

Ниже приводится мой индекс просмотра книг index.blade.php view

Но когда я нажимаю на имя издателя для сортировки, это выдает мне такую ​​ошибку.

QueryException in Connection.php line 770:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'publisher_name' in 'order clause' (SQL: select `books`.* from `books` inner join `publishers` on `publishers`.`id` = `books`.`publisher_id` order by `publisher_name` asc limit 5 offset 0)

Так, что я могу сделать, чтобы решить это?

Ответы [ 2 ]

2 голосов
/ 12 апреля 2020

Вы можете использовать псевдоним от publishers.name до publisher_name, чтобы mysql мог найти столбец псевдонимов:

$books = Book::join('publishers','publishers.id','books.publisher_id')
                ->orderBy($sort,$direction)->selectRaw('books.*, publishers.name AS publisher_name')->paginate(5);
0 голосов
/ 12 апреля 2020

Как и в вашем join, вы должны использовать точечную запись в $sort, table.column.

Кроме того ... Это был бы лучший способ кодировать это:

  1. Добавьте отношение publisher к вашей Book модели.
function publisher () 
{
    return $this->belongsTo("App\Publisher");
} 
Добавьте отношение books к вашей Publisher модели.
function books () 
{
     return $this->hasMany("App\Book");
} 
Измените ваш запрос на что-то вроде этого:
Book::with("publisher")
           ->orderby($sort, $direction)
           ->paginate(5);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...