【问题标题】:Laravel relationship custom key [duplicate]Laravel关系自定义键[重复]
【发布时间】:2020-12-04 04:59:08
【问题描述】:

我是 Laravel 的新手大约几周,现在我正在学习关系任务。我一直在搜索有关它的相关主题,但我不知道为什么我的代码不起作用。

我有 2 张员工和电话表:

员工:

  • ID                int
  • 名称          varchar
  • 年龄             int
  • 位置       varchar
  • 地址       varchar
  • created_at   时间戳
  • update_at    时间戳
  • deleted_at    时间戳

电话:

  • ID                     int
  • 没有                    varchar
  • Employee_ID   int

我正在使用 Laravel v.8

型号:PhoneS.php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class PhoneS extends Model
{
    use HasFactory;

    protected $table = "Phone";
 
    public function EmployeeS()
    {
        return $this->belongsTo('App\Models\EmployeeS', 'Employee_ID', 'ID');
    }
}

模型: EmployeeS.php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class EmployeeS extends Model
{
    use HasFactory;

    protected $table = "Employee";
    
    public function PhoneS()
    {
        return $this->hasOne('App\Models\PhoneS', 'Employee_ID', 'ID' );
    }
}

控制器:Phone.php

namespace App\Http\Controllers;
 
 use Illuminate\Http\Request;
 
 use App\Models\EmployeeS;
 
 class Employee extends Controller {
     public function index()
     {
         $EmployeeS = EmployeeS::all();
         return $EmployeeS;     
         
     }
 }

结果:

[
{
“身份证”:1,
“姓名”:“约翰”,
“年龄”:26,
“职位”:“IT”,
“地址”:“林荫大道”,
“created_at”:空,
“updated_at”:空,
“deleted_at”:空
},
{
“身份证”:2,
“名称”:“Doe”,
“年龄”:25,
“位置”:“加速”,
"地址": "大道街",
“created_at”:空,
“updated_at”:空,
“deleted_at”:空
},
...
...
]

那里没有字段:PhoneS...
当我尝试使用以下命令访问它时:return $EmployeeS->PhoneS,它会给出错误消息:

例外
此集合中不存在属性 [PhoneS] 实例。

谁能告诉我发生了什么?
我相信我错过了 Laravel 关系概念。
你能指出我错过的地方吗?

提前谢谢..

【问题讨论】:

  • 欢迎来到 SO ... EmployeeS::all();EmployeeS::with('PhoneS')->get();
  • 检查this,如果您遵循建议的标准,您对非强制错误的头痛就会少很多。
  • 太棒了!谢谢@KamleshPaul & Tpojka

标签: laravel relationship


【解决方案1】:

EmployeeS::all() 将返回代表数据库记录的 EmployeeS 对象集合

所以$EmployeeS->PhoneS 将不起作用,因为它就像尝试访问集合上的相关模型一样 - 因此您会遇到错误

$EmployeeS = EmployeeS::all(); //$EmployeeS is a collection

foreach($EmployeeS as $employee) {
    //Iterating over each object in collection
    echo $employee->PhoneS //this will work
}

但是,如果您需要相关记录,那么最好预先加载关系以避免 N+1 查询问题

$Employee::with('PhoneS')->all();

【讨论】:

  • 很好......它就像一个魅力。谢谢!但是为什么当我使用:$EmployeeS[0] 时,没有电话字段。但我可以通过以下方式访问它:$EmployeeS[0]->Phone
猜你喜欢
  • 2021-12-12
  • 2019-02-09
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 2018-10-16
  • 2021-11-09
  • 2023-04-01
  • 2021-04-04
相关资源
最近更新 更多