首页 > 解决方案 > 如何在 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'=>''
        ];
}

在此处输入图像描述

从我的产品模型中访问属性的正确方法是什么?

我正在将该脚本用于我的自动完成表单。请提前告知谢谢!

标签: laraveleloquentrelationship

解决方案


如果您想通过查询关系来获得结果,您可以使用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'           => '',
    ];
}


推荐阅读