Как получить доступ к атрибутам из Eloquent в Laravel - PullRequest
0 голосов
/ 18 марта 2019

У меня есть следующие отношения,

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 ]

2 голосов
/ 18 марта 2019

Если вы хотите получить результаты, запрашивая отношения, вы можете использовать whereHas () например,

$wh1Summaries->whereHas('product', function ($q) use ($query) {
    $q->where('product_code', 'LIKE', '%' . $query . '%');
}); 

Кроме того, при использовании get() или all() с Eloquent возвращается коллекция . Это позволит вам использовать такие методы, как 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'           => '',
    ];
}

0 голосов
/ 18 марта 2019

Ваш звонок должен быть:

$wh1Summaries = Warehouse1StockSummaries::with(['product' => function($q) {
    $q->where('product_code','LIKE','%'.$query.'%');
}]);

Построитель запросов ->where() не должен использоваться на product, так как по существу вы запрашиваете сводные данные, а не продукт.

Поскольку условие ::with() является условным для $request->type == product_name, вы можете использовать newQuery(), чтобы начать новый красноречивый запрос, а затем указать, какое условие ->with() использовать:

$wh1Summaries = Warehouse1StockSummaries::newQuery();

if($request->type == 'product_name'){
    $wh1Summaries = $wh1Summaries->with(['product' => function($q) use ($query) {
        $q->where('product_code','LIKE','%'.$query.'%');
    }]);
} else {
    $wh1Summaries = $wh1Summaries->with('product');
}
...