如何从Laravel中雄辩的访问属性

时间:2019-03-18 15:44:10

标签: laravel eloquent relationship

我有以下恋情,

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'=>''
        ];
}

enter image description here

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

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

2 个答案:

答案 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()