Laravel 5.8 - красноречиво не слушая, где на связи - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь выполнить запрос where для моего отношения с именем employee_label.

Таблица employee_label выглядит следующим образом:

+----+-------------+----------+
| id | employee_id | label_id |
+----+-------------+----------+
|  1 |         123 |      123 |
|  2 |         456 |      456 |
|  3 |         768 |      768 |
+----+-------------+----------+

Остальные where() и orWhere() получает пустую array() по умолчанию, но может содержать данные, например: ['inactive' => 0].

Ожидаемый результат: Я ожидаю получить сотрудников с, например, меткой 123, когда я предоставлю метку 123 как where() для отношения.

Фактический результат: Все сотрудники возвращаются, данные не фильтруются.

Код:

$employees = Employee::with(['employee_label' => function($query) use ($request) {
    $query->where('label_id', '=', $request->get('label'));
}])->where($searchQuery)->orWhere($orQuery)->orderBy('inactive', 'asc')->paginate(20);

Что я пробовал: Я пытался изменить $query->where('label_id') на $query->where('employee_label.label_id') без изменений в результате.

Модель Employee

class Employee extends Model
{
    protected $table = 'employees';
    protected $fillable = [
        'name',
        'surname',
        'inactive',
        'entered_into_service'
    ];

    public function employee_label() {
        return $this->hasOne('App\EmployeeLabel');
    }

}

Модель EmployeeLabel

class EmployeeLabel extends Model
{

    protected $table = 'employee_label';
    protected $fillable = [
        'employee_id',
        'label_id'
    ];

    public function employee() {
        return $this->belongsTo('App\Employee');
    }

    public function label() {
        return $this->belongsTo('App\Label');
    }

}

Ответы [ 3 ]

0 голосов
/ 06 января 2020

После долгих поисков я наконец-то нашел ответ на эту странную проблему.

Очевидно, вместо Employee::with() вы должны использовать Employee::whereHas().

Итак, окончательный код будет:

$employees = Employee::whereHas('employee_label', function($query) use ($request) {
    $query->where('label_id', '=', $request->get('label'));
})->where($searchQuery)->orWhere($orQuery)->orderBy('inactive', 'asc')->paginate(20);

См. документацию для получения дополнительной информации.

Спасибо всем, кто помог!

0 голосов
/ 06 января 2020

Попробуйте обновить модель сотрудника до:

    public function employeeLabel() {
        return $this->hasOne('App\EmployeeLabel', 'employee_id', 'id');
    }

Это автоматически связывает отношения, так что вам не нужно это делать в красноречивом вызове.

Затем метод для получения всех сотрудников и связанных с ними этикетки и обратная нумерация с:

$employees = Employee::all()->with('employeeLabel')
                            ->orderBy('inactive', 'asc')
                            ->paginate(20);

https://laravel.com/docs/6.x/eloquent-relationships#one-to-one

0 голосов
/ 06 января 2020

Я думаю, вы забыли вернуть свой $ query объект

Вместо

$query->where('label_id', '=', $request->get('label'));

Попробуйте вернуть свой $ запрос из employee_label метод обратного вызова

return $query->where('label_id', '=', $request->get('label'));
...