我有以下恋情,
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'=>''
];
}
从我的产品模型访问属性的正确方法是什么?
我正在将该脚本用于自动完成表格。请提前告知谢谢!
答案 0 :(得分:2)
如果您想通过查询一种关系来获得结果,则可以使用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' => '',
];
}
答案 1 :(得分:0)
您的电话应该是:
class="ui centered celled table">
不应在$wh1Summaries = Warehouse1StockSummaries::with(['product' => function($q) {
$q->where('product_code','LIKE','%'.$query.'%');
}]);
上使用查询生成器的->where()
,因为本质上您是在查询摘要而不是产品。
由于product
子句是::with()
的条件,因此您可以使用$request->type == product_name
来启动新的口才查询,然后设置要使用的newQuery()
子句:>
->with()