Laravel 从具有一对一关系的 2 列中获取值

Laravel get value from 2 column with relationship one to one

我有 2 个 table 并且有一对一的关系。第二个 table 使用第一个的外键,我想显示一个包含所有值的列表。

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);
}

如果您只想要一个包含所有值对的列表,使用以下代码就足够了:

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 in register.

希望对您有所帮助。

我认为你必须使用 leftjoin。 (不是 foreach 和 php 循环)

因为:

The alternative of handling this inside your PHP code with a foreach loop is unattractive for several reasons. First, you would probably need to bring in all information from both tables, which is wasteful from both a memory and network usage point of view. Then, even after you have brought in the data, you would be relying on PHP to perform the join. PHP wasn't really designed for in house database operations, and cannot use something like an index to speed up the process.

因此您可以像这样编写查询:

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();
}