laravel - Laravel Eloquent 获取数据(有关系)的困惑
问题描述
我对如何正确地从 Eloquent 模型中提取数据有点困惑。我确实阅读了文档,但是在任何地方都没有提到,或者我错过了。
假设我们有两个模型,Client
并且Country
(注意:我只添加了相关代码,否则这个问题会很长):
客户:
<?php
namespace App\Models\Client;
use App\Models\BaseModel;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
/**
* @property int id
* @property int country_id
*/
class Client extends BaseModel
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
...
'country_id',
...
];
/**
* Return Country relationship
*
* @return BelongsTo
*/
public function country(): BelongsTo
{
return $this->belongsTo(Country::class);
}
}
国家:
<?php
namespace App\Models\Country;
use App\Models\BaseModel;
use Illuminate\Database\Eloquent\Relations\HasMany;
/**
* @property int id
*/
class Country extends BaseModel
{
public function clients(): hasMany
{
return $this->hasMany(Client::class);
}
}
没什么特别的,两个普通型号。现在,当我尝试提取数据时,我遇到了一些问题:
dd(Country::findOrFail(32));
// 正确:返回所选国家dd(Country::findOrFail(32)->first());
// 错误:返回数据库中的第一个国家,而不是 ID 为 32 的国家,预期:具有选定国家的单个国家对象dd(Country::findOrFail(32)->get());
// 错误:返回数据库中的所有国家,预期:包含一个国家的对象数组dd(Country::with('clients')->findOrFail(32)->first());
// 错误:返回数据库中的第一个国家,而不是 ID 为 32 的国家,关系也不正确,预期:对象与所选国家的有效关系(客户)作为对象数组dd(Country::findOrFail(32)->clients());
// WRONG:返回 HasMany 关系,无数据,EXPECTED:作为对象的客户端数组dd(Country::findOrFail(32)->clients()->get());
// 正确:返回有效数据,客户端数组作为对象dd(Country::findOrFail(32)->clients()->first());
// 正确:返回所选国家/地区的第一个客户
那么,为什么所有错误的都是错误的呢?我是否错误地解释了文档?最令人沮丧的是dd(Country::with('clients')->findOrFail(32)->first())
,现在我无法根据所选国家/地区进行过滤,然后还提供该国家/地区的客户列表。我认为 Eloquent 相当先进,所以我认为我做错了什么,并希望得到一些指导。请注意,在最新示例中,我还尝试将查询反转为dd(Country::findOrFail(32)->with('clients')->first())
,结果相同。
解决方案
在我看来,你在这里混淆了一些东西。例如,将 FindOrFail() 与 first() 组合是双倍的。看这里,这是我找到的一个很好的解释:
find($id)
接受一个 id 并返回一个模型。如果不存在匹配的模型,则返回 null。findOrFail($id)
接受一个 id 并返回一个模型。如果不存在匹配的模型,则会引发错误 1。first()
返回在数据库中找到的第一条记录。如果不存在匹配的模型,则返回 null。firstOrFail()
返回在数据库中找到的第一条记录。如果不存在匹配的模型,则会引发错误 1。get()
返回与查询匹配的模型集合。pluck($column)
返回仅包含给定列中的值的集合。在之前的 Laravel 版本中,这个方法被称为列表。toArray()
将模型/集合转换为简单的 PHP 数组。
推荐阅读
- python - 如何访问 pylint 报告
- tcp - LWFTP 的问题:不发送任何消息
- visual-studio-code - 如何通过内置格式化程序格式化代码以使用指定的`tabSize`?
- node.js - Sequelize - 获取数据库中的字段
- sql - 删除 JSON_AGG(聚合函数)中的括号和引号
- c# - C# XML XmlDeserialize - 获取子属性的值属性到父属性
- dictionary - mmap 支持截面图吗?
- r - 如何将项目列表转换为R中的空向量?
- rust - 在 Rust 中,一个类型的所有值必须使用相同数量的内存意味着什么?
- ios - 无法在 Google Colab 中复制、剪切或粘贴代码(Google Colab + iOS 错误)