Выберите определенные поля в Eloquent нетерпеливой загрузке, не работающей

У меня есть модель Notifications, которая принадлежит к User. Я хочу загружать пользователя, когда выбрана коллекция уведомлений, и загружать только модель с names и emails. Однако при использовании метода select запрос возвращает значение null.

$notifications->load(['user' => function($query){
    $query->select(["name","email"]);
}]);

Если параметр для метода select() указан ниже, он дает все поля:

$notifications->load(['user' => function($query){
    $query->select(["*"]    
}]);

Просто вопрос: почему бы вам выбрать при активной загрузке? Если вы хотите отфильтровать результаты для ответа, вы можете добавить protected $hidden = [] в свою модель.

online Thomas 31.05.2018 13:22

Есть ли конкретная причина, по которой вы используете $ notifications вместо модели уведомлений?

GaimZz 31.05.2018 13:23

если у вас уже есть коллекция, которую вы не можете использовать → загрузить в этой коллекции, по крайней мере, метод загрузки не отображается в доступных методах коллекции документов laravel laravel.com/docs/5.6/eloquent-collections#available-methods

GaimZz 31.05.2018 13:27

@GaimZz Это неправда: laravel.com/docs/5.6/eloquent-relationships#lazy-eager-loadi‌ ng

online Thomas 31.05.2018 13:31

ммм вижу спасибо: D

GaimZz 31.05.2018 13:32

Активная загрузка работает только при выборе столбца внешнего ключа (id).

Jonas Staudenmeir 31.05.2018 14:10

@GaimZz модель уведомления вводится через сервисный контейнер. Кстати, есть ли разница в нетерпеливой загрузке?

Birendra Gurung 31.05.2018 19:53

@GaimZz Активная загрузка работает, но основная проблема здесь - это выделенная часть.

Birendra Gurung 31.05.2018 19:54

@BirendraGurung, если мой ответ не работает, вы можете попробовать сделать свой выбор следующим образом-> $ query-> select (["id", "name", "email"]), потому что, как указано в документации laravel, при использовании это вы всегда должны выбирать идентификатор, хотите вы или нет

GaimZz 31.05.2018 19:56

@JonasStaudenmeir Да, решением было добавление первичного ключа к параметру. Все, что я сделал, это добавил столбец первичного ключа (в моем случае: ID), и в моем случае это сработало.

Birendra Gurung 31.05.2018 20:08
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
7
10
3 055
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Возможно, выбор таких полей сработает:

$notifications->load('user:id,name,email');

То, что вы пытаетесь, предназначено для добавления ограничений, а не для выбора некоторых полей

он не будет работать с замыканиями, когда вам нужно добавить некоторые ограничения к вашему запросу.

Birendra Gurung 31.05.2018 20:10
Ответ принят как подходящий

Просто нужно было добавить столбец первичного ключа, и это сработало.

$notifications->load(['user' => function($query){
    $query->select(["ID","name","email"]);
}]);

Таким образом, в запрос можно добавить любые ограничения.

Если у вас все наоборот, вам нужно включить внешний ключ: $user->load(['notifications' => function($q){ $q->select(['user_id', 'message']); }]);, потому что id не работает.

Jannie Theunissen 11.08.2018 19:24

Вы должны передать внешний ключ, если вы выбираете данные с помощью select. Взглянуть

public function index()
{ 
    $employee = Employee::with(['pay_salary' => function($query){
       $query->select(['employee_id','salary_amount'])
             ->whereMonth('paying_date',\Carbon\Carbon::now()->month);
    },'getSalary:id,employeeID,salary'])->get();
    
    return View::make('admin.salary.index',['data' => $employee]);
}

Другие вопросы по теме