laravel - 如何在 laravel 中访问 eloquent 的属性
问题描述
我有以下关系,
public function product()
{
return $this->hasOne('App\Products', 'id','product_id');
}
和
public function warehouse1StockSummary()
{
return $this->hasMany('App\Warehouse1StockSummaries', 'id', 'product_codeid');
}
这就是我如何称呼这两个模型
$wh1Summaries=Warehouse1StockSummaries::with('product');
他们正在工作,因为如果我这样做,我可以获得他们的信息
if($request->type=='qty_in'){
$wh1Summaries->where('qty_in','LIKE','%'.$query.'%');
}
我的 foreach 也可以通过这样做来获得它们
foreach ($wh1Summaries as $wh1Summary) {
$data[]=array(
'product_code'=>$wh1Summary->product->product_code,
'name'=>$wh1Summary->product->name,
'qty_in'=>$wh1Summary->qty_in,
'id'=>$wh1Summary->product->id
);
}
我的问题是,如果我尝试像这样调用产品的属性
if($request->type=='product_code'){
$wh1Summaries->product->where('product_code','LIKE','%'.$query.'%');
}
我变得空虚。
这是我的功能:
public function transferResponse(Request $request){
$query = $request->get('term','');
$wh1Summaries=Warehouse1StockSummaries::with('product');
if($request->type=='product_code'){
$wh1Summaries->product->where('product_code','LIKE','%'.$query.'%');
}
if($request->type=='product_name'){
$wh1Summaries->product->where('name','LIKE','%'.$query.'%');
}
if($request->type=='qty_in'){
$wh1Summaries->where('qty_in','LIKE','%'.$query.'%');
}
if($request->type=='product_id'){
$wh1Summaries->product->where('id','LIKE','%'.$query.'%');
}
$wh1Summaries=$wh1Summaries->get();
$data=array();
foreach ($wh1Summaries as $wh1Summary) {
$data[]=array(
'product_code'=>$wh1Summary->product->product_code,
'name'=>$wh1Summary->product->name,
'qty_in'=>$wh1Summary->qty_in,
'id'=>$wh1Summary->product->id
);
}
if(count($data))
return $data;
else
return [
'product_code'=>'',
'name'=>'',
'qty_in'=>'',
'id'=>''
];
}
从我的产品模型中访问属性的正确方法是什么?
我正在将该脚本用于我的自动完成表单。请提前告知谢谢!
解决方案
如果您想通过查询关系来获得结果,您可以使用whereHas()例如
$wh1Summaries->whereHas('product', function ($q) use ($query) {
$q->where('product_code', 'LIKE', '%' . $query . '%');
});
此外,当使用get()
或all()
与 Eloquent 一起使用时,它会返回一个collection。这将允许您使用诸如map()之类的方法,这将使您不必使用临时变量和 foreach 循环。
这将意味着您的控制器看起来像:
public function transferResponse(Request $request)
{
$query = $request->get('term', '');
$wh1Summaries = Warehouse1StockSummaries::with('product');
if ($request->type == 'product_code') {
$wh1Summaries->whereHas('product', function ($q) use ($query) {
$q->where('product_code', 'LIKE', '%' . $query . '%');
});
}
if ($request->type == 'product_name') {
$wh1Summaries->whereHas('product', function ($q) use ($query) {
$q->where('name', 'LIKE', '%' . $query . '%');
});
}
if ($request->type == 'qty_in') {
$wh1Summaries->where('qty_in', 'LIKE', '%' . $query . '%');
}
if ($request->type == 'product_id') {
$wh1Summaries->product->where('id', 'LIKE', '%' . $query . '%');
}
$data = $wh1Summaries->get()->map(function ($wh1Summary) {
return [
'product_code' => $wh1Summary->product->product_code,
'name' => $wh1Summary->product->name,
'qty_in' => $wh1Summary->qty_in,
'id' => $wh1Summary->product->id,
];
});
if ($data->isNotEmpty()) {
return $data;
}
return [
'product_code' => '',
'name' => '',
'qty_in' => '',
'id' => '',
];
}
推荐阅读
- azure - 如何从多个 Azure 服务中删除标签?
- ios - UIImage initWithCGImage 导致 Obj-C 中的内存问题
- python - Django - CreateView 将创建的对象 id 传递给另一个 CreateView
- pyspark - pyspark中不相等的运算符给出错误的结果
- ios - iOS 应用签名期间的预填充分发清单信息
- jmeter - JMeter:在“用户”之间划分数据集
- python - 如何从 chalice 应用程序调用 sagemaker xgboost 端点?
- arrays - 如何从数组中的数组创建列
- html - XML 数据不会在页面上居中
- sql-server - 查询在指定日期范围内活动的记录