laravel eloquent: Eloquent должен возвращать что-то, когда нет данных, вместо возврата нулевого объекта - PullRequest
0 голосов
/ 10 октября 2018

У меня есть такое отношение к моей модели продукта.

public function productInventory(){
        return $this->hasOne('App\Models\Ecommerce\Inventory', 'product_id')->where('is_deleted', 0);
}

Иногда я, возможно, не вставил этот конкретный продукт в свою таблицу инвентаризации.Таким образом, это отношение все еще находится в игре с представлением, но будет пытаться получить productInventory-> price, которая выдаст ошибку, не может получить цену нулевого объекта .Итак, я сделал это сейчас, что просто сделать.Но количество равно 1 или больше 1, потому что есть другие продукты.Так как же я смогу вернуть только ноль для того конкретного продукта, у которого нет данных в таблице инвентаризации?

public function productInventory(){
        $has_inv = Inventory::where('product_id',$this->id)->where('is_deleted', 0)->count();        
        if($has_inv < 1){
            return null;
        }
        return $this->hasOne('App\Models\Ecommerce\Inventory', 'product_id')->where('is_deleted', 0);
    }

1 Ответ

0 голосов
/ 10 октября 2018

Во-первых, метод productInventory () должен возвращать отношение.не имеет значения, что для некоторых записей нет подключенного инвентаря.Этот метод должен возвращать отношения, вот и все ... Путать это возвращение с фактическим состоянием БД («для этого конкретного продукта нет инвентаря»), это действительно не нужно, ИМХО.

ТакЕсли ваша проблема заключается в представлении, то там, где нет инвентаря, вы получаете ошибку, лучшим решением будет:

Проверьте в представлении, есть ли доступный объект, и только затем проверьте атрибут ценына этом объекте.

Вы можете проверить это с помощью чего-то вроде ...

@if(is_null($productInventory)) 
 {{$productInventory->price}}
@endif

Кстати, это ПРИМЕР кода, а не реальный реальный код.Но это дает вам представление о том, где решить эту проблему.

Потому что вы решаете это не в том месте.Имхо, метод отношений НЕ место.

Если вы используете это во многих представлениях, вы должны оптимизировать структуру VIEW (используя include!), А не перемещаться с проблемой в другое место в вашемcode.

Сделайте включение для кода представления, который вы часто используете, и включите что-то вроде:

@include('product_incventory_price_data')

О включениях в Blade

Давайте использовать пример для вашего <head> кода на ваших веб-страницах.Вы можете добавить это ко всем отдельным веб-страницам (ваши файлы просмотра).давайте рассмотрим два разных представления (A en B)

file: view_a.blade.php

<html>
<head>
    <meta charset="utf-8">
    <title>{{$page->title}}</title>
    <meta name="description" content="{{$page->description}}">
    <meta name="keywords" content="{{$page->keywords}}">
</head>
<body>
...stuff for view A
</body>
</html>

file: view_b.blade.php

<html>
<head>
    <meta charset="utf-8">
    <title>{{$page->title}}</title>
    <meta name="description" content="{{$page->description}}">
    <meta name="keywords" content="{{$page->keywords}}">
</head>
<body>
...stuff for view B
</body>
</html>

AЛучшее решение: переместить весь код <head> в другой файл (в папку, такую ​​как views / shared).И включите этот файл в оба представления A en B.

shared / head.blade.php

<head>
    <meta charset="utf-8">
    <title>{{$page->title}}</title>
    <meta name="description" content="{{$page->description}}">
    <meta name="keywords" content="{{$page->keywords}}">
</head>

view_a

<html>
@include('shared/head')
<body>
...stuff for view A
</body>
</html>

view_b

<html>
@include('shared/head')
<body>
...stuff for view B
</body>
</html>

Вы можете сделать это со всеми видами фрагментов кода.Кроме того, информация о цене вашего продукта может быть перемещена в одно место и использована в нескольких других представлениях с помощью @include () ...

Данные, которые вы передаете в представления вашего контроллера, также передаются во включаемые файлы.Не беспокойтесь об этом ....: -)

Документация Laravel о представлениях и вложенных представлениях

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...