PHP Laravel, как сортировать, используя две таблицы - PullRequest
1 голос
/ 06 мая 2019

В моем приложении Laravel есть две таблицы MySQL, одна называется categories, а другая - employees.Структура categories -таблицы такова:

id
category
order

, а в таблице employees также есть столбцы под названием:

id
category
order

Итак, допустим, у меня есть categories какКонсультанты, программисты и администрация, и когда я создаю сотрудника в бэкэнде, я могу назначить нового сотрудника в одну из этих категорий.Теперь в интерфейсе моего Laravel -приложения я хочу, чтобы сотрудники отображались по категориям, а также по категориям в порядке их присвоения.Допустим, у Консультантов порядок 2, у программистов порядок 1 и порядок администрирования 3.

Сейчас мой контроллер выглядит следующим образом:

use App\Employee;

class EmployeesController extends Controller
{

    public function index()
    {
       $employees = Employee::all()->groupBy('category');

       return view('app.employee.index', compact('employees'));
    }
}

и мой файл вида блейда:

@foreach ($employees as $category => $workers)
  <div class="col text-center mb-6">
    <h2>{{ $category }}</h2>
  </div>
  <div class="row px-4 px-xl-10">
    @foreach($workers->sortBy('order') as $worker)
      // content of the employee
    @endforeach
 </div>
@endforeach

Это правильно сортирует сотрудников, просто используя категории таблицы «Сотрудники», но при этом я не могу сортировать по категориям, как я хочу, как описано выше.

Итак, кто-нибудь может мне помочь?

РЕДАКТИРОВАТЬ

В качестве примера я хочу, чтобы результат выглядел следующим образом:

Programmers (since this category has order of 1)
 // employees with category "programmers" here

Consultants (2)
 // employees with category "consultants" here

Administration (3)
 // employees with category "administration" here

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Мне кажется, что определения ваших столбцов немного сбивают с толку, могу я предложить изменить ваши столбцы:

Table 'categories'
------------------
id
name
order

Table 'employees'
-----------------
id
category_id

Добавление внешнего ключа в таблицу сотрудников:

$table->foreign('category_id')->references('id')->on('categories')

И тогда ваши модели могут быть сопоставлены друг с другом с помощью методов отношений:

class Employee extends Model
{
    public function category()
    { 
        return $this->belongsTo(Category::class);
    }
}

class Category extends Model
{
    public function employees()
    { 
        return $this->hasMany(Employee::class);
    }
}

Таким образом, с этим мы можем просто запросить базу данных из контроллера:

use App\Category;

class EmployeesController extends Controller
{

    public function index()
    {
       $categories = Category::orderBy('order')->get();

       return view('app.employee.index', compact('categories'));
    }
}

и отобразите результаты в виде лезвия:

@foreach ($categories as $category)
  <div class="col text-center mb-6">
    <h2>{{ $category->name }}</h2>
  </div>
  <div class="row px-4 px-xl-10">
    @foreach($category->employees as $employee)
      // content of the employee
    @endforeach
 </div>
@endforeach
0 голосов
/ 06 мая 2019

Я думаю, вы должны изменить свой запрос на:

$categories = Category::with(['employees'=>function($q){
   $q->orderBy('order');
}])->orderBy('order')->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...