gpt4 book ai didi

Laravel Eloquent 获取数据(与关系)混淆

转载 作者:行者123 更新时间:2023-12-04 17:09:29 26 4
gpt4 key购买 nike

我对如何正确地从 Eloquent 模型中提取数据感到有点困惑。我确实阅读了文档,但在任何地方都没有提到这一点,或者我错过了。

假设我们有两个模型,ClientCountry(注意:我只添加了相关代码,否则这个问题会很长):

客户:

<?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());//错误:返回 HasMany 关系,无数据,预期:作为对象的客户端数组
  • 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() 结合使用是双重的。看这里,这是我找到的一个很好的解释:

  1. find($id) 接受一个 id 并返回一个模型。如果没有匹配模型存在,则返回 null。
  2. findOrFail($id) 获取一个 id 并返回一个模型。如果不存在匹配的模型,它会抛出错误 1。
  3. first() 返回在数据库中找到的第一条记录。如果不存在匹配模型,则返回 null。
  4. firstOrFail() 返回在数据库中找到的第一条记录。如果不存在匹配的模型,它会抛出错误 1。
  5. get() 返回与查询匹配的模型集合。
  6. pluck($column) 返回给定列中的值的集合。在以前的 Laravel 版本中,此方法称为列表。
  7. toArray() 将模型/集合转换为简单的 PHP 数组。

来源:https://stackoverflow.com/a/33027466/14807111

关于Laravel Eloquent 获取数据(与关系)混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69785656/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com