Php 雄辩的模型关系不返回子关系特定的列值
我曾尝试在产品名等于Oops时获取用户信息和产品详细信息,其中指定了昵称和名称,但我不知道getProducts为什么不返回任何东西 用户模型Php 雄辩的模型关系不返回子关系特定的列值,php,mysql,laravel,eloquent,eloquent-relationship,Php,Mysql,Laravel,Eloquent,Eloquent Relationship,我曾尝试在产品名等于Oops时获取用户信息和产品详细信息,其中指定了昵称和名称,但我不知道getProducts为什么不返回任何东西 用户模型 public function getProducts(){ return $this->hasMany('App\Models\Product','users_id'); } 产品模型 public function users(){ return $this->belongsTo(User::c
public function getProducts(){
return $this->hasMany('App\Models\Product','users_id');
}
产品模型
public function users(){
return $this->belongsTo(User::class);
}
提取数据的代码:
$products = User::with(['getProducts' => function($query){
$query->select("users_id","name","nickname");
}])->get();
电流输出:
"data": [
{
"id": 1,
"name": "John Smith",
"email": "john.smith@hotmail.com",
"email_verified_at": null,
"created_at": "2021-04-08T13:29:13.000000Z",
"updated_at": "2021-04-08T13:29:13.000000Z",
"role": 0,
"get_products": [
]
},
{
"id": 2,
"name": "Kelvin Ooi",
"email": "kelvin.ooi@hotmail.com",
"email_verified_at": null,
"created_at": "2021-04-08T13:29:13.000000Z",
"updated_at": "2021-04-13T12:07:11.000000Z",
"role": 1,
"get_products": [
{
"nickname":"MCD",
"name":"Oops"
},
{
"nickname":"Mary Brown",
"name":"Oops"
},
{
"nickname":"Kentucy",
"name":"KFC"
},
{
"nickname":"Texas Chicken",
"name":"TXS"
}
]
}
]
预期产出
"data": [
{
"id": 1,
"name": "John Smith",
"email": "john.smith@hotmail.com",
"email_verified_at": null,
"created_at": "2021-04-08T13:29:13.000000Z",
"updated_at": "2021-04-08T13:29:13.000000Z",
"role": 0,
"get_products": [
]
},
{
"id": 2,
"name": "Kelvin Ooi",
"email": "kelvin.ooi@hotmail.com",
"email_verified_at": null,
"created_at": "2021-04-08T13:29:13.000000Z",
"updated_at": "2021-04-13T12:07:11.000000Z",
"role": 1,
"get_products": [
{
"nickname":"MCD",
"name":"Oops"
},
{
"nickname":"Mary Brown",
"name":"Oops"
}
]
}
]
getProducts并不是这种关系的好名字,让我们简单地称之为products
公共功能产品
{
return$this->hasmall'App\Models\Product'、'users\u id';
}
注释中的代码不起作用,因为您在主查询中指定了where子句,而不是子查询
返回用户::使用['products'=>函数$query{
$query->selectusers\u id、name、昵称;
}]
//这必须在子查询中。
->whereproducts.name,Oops
->得到;
因此,让我们将您的代码更新为:
$productName='Oops';
返回用户::使用['products'=>函数$query use$productName{
$query->selectusers\u id、name、昵称、price
->其中名称,如%{$productName}%;
}]
->得到;
我已经看到你对这个答案的评论。让我们为用户模型定义一个总数:
类用户扩展模型
{
受保护的$appends=['total'];
公共函数getTotalAttribute
{
//这是更高阶的消息,如果您没有使用它:https://laravel.com/docs/8.x/collectionshigher-order-messages
返回$this->products->sum->price;
}
}
然后total属性将成为任何用户的一部分。我认为您需要将user\u id包含在外键中,因此$query->select'user\u id',name',昵称';,否则它不知道如何加载它们。我已经检查了我的数据库已经有外键关系,但它仍然不工作..如果我想使用['getProducts'=>function$query{$query->selectusers\u id,name,昵称;}]->whereproducts.name,拉取产品名为Oops$products=user::的用户,该怎么办,Oops->get;但是它不起作用..所以我只是用我的本地模型/关系测试了你的代码,它起作用了:Model::with['relationship'=>function$q{$q->select'id',relationship_id',column';}]->find1;这将返回ID为1的模型,并记录与这3列的关系。你的代码应该是一样的……如果我想对产品价格求和并显示如图所示的产品详细信息,该怎么办:在最终获取之前,我试图将产品中的->addSelectDB::rawSELECT SUMp.price添加为p,其中p.id=products.id,但它仍然会抛出一个错误。@MiracleHades这行不通。主查询不知道products表。with方法内的查询是主查询的单独查询。我已经更新了我的答案。除此之外,如果我想从模型实例中选择id、email和name作为fullname。我曾尝试在使用之前使用Pull,但我没有运气让它起作用。我遇到了另一个问题,我不知道为什么产品系列仍然跟随我,而我甚至没有包括“产品”。可执行代码是$ttl=User::find1->first;它应该只返回普通用户集合,而不是用户混合产品集合。。。