Laravel получить значение из 2 столбца с отношением один к одному - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть 2 таблицы и отношения один к одному. Вторая таблица использует FK из первой, и я хочу отобразить список со всеми значениями.

public function index(Request $request)
{
   $listOfPersons = new Person();
   $listOfRegisters = new  Register();

   $listOfRegisters->listOfPersons()->associate();
   return $listOfRegisters;
}

В регистровой модели

public function people(){
    return $this->hasOne(Person::class);
}

Персональная модель

public function register(){
    return $this->hasOne(Register::class);
}

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Если вы просто хотите получить список со всеми парами значений, этого будет достаточно с этим кодом:

public function index(Request $request)
{
    $registers = Register::all();
    $list = [];
    foreach($registers as $register){
        array_push($list,['register'=> $register, 'person'=>$register->people]);
    }
    return $list;
}

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

Надеюсь, это поможет.

1 голос
/ 18 февраля 2020

Я думаю, что вы должны использовать левое соединение. (не foreach и php l oop)

Потому что:

Альтернатива обработки этого кода внутри PHP с помощью foreach l oop непривлекательна для некоторые причины. Во-первых, вам, вероятно, потребуется ввести всю информацию из обеих таблиц, что расточительно с точки зрения использования памяти и сети. Затем, даже после ввода данных, вы будете полагаться на PHP при выполнении объединения. PHP не был специально разработан для внутренних операций с базами данных и не может использовать что-то вроде индекса для ускорения процесса.

Таким образом, вы можете написать свой запрос как:

User::leftJoin('register', 'register.user_id', '=', 'id');

Однако я предпочитаю добавить область в моей модели для этой ситуации

<?php

class User extends Authenticatable
{
    public function scopeRegister($builder)
    {
       $query = $query->leftJoin('register', 'register.user_id', '=', 'id');
       return $query;

    }

и в моем контроллере

public function index(Request $request)
{
    $records = User::register()->get();
}
...