Как выбрать функцию модели через красноречивое отношение - laravel? - PullRequest
2 голосов
/ 27 февраля 2020

В моем проекте у меня есть список заказов клиентов. У каждого заказа есть поле id_carrier для поиска имени оператора (например, dhl, ups et c.). Проблема в том, что мне нужно выбрать имя оператора с помощью функции getName () из модели носителя.

Поэтому мой запрос выглядит так:

public function loadOrders()
{
    $orders = Order::select('id', 'reference', 'created_at','total_value')->with(['carrier' => function($carrier){
        $carrier->getName();
    }])->paginate(20);

    return $orders;
}

Сообщение об ошибке:

message: "Call to undefined method Illuminate\Database\Eloquent\Relations\HasOne::getName()"

Порядок модели:

public function carrier()
    {
        return $this->hasOne('App\SupremeShop\Models\Carrier', 'id', 'id_carrier');
    }

Несущая модели

public function getName()
    {
            return $this->translation->where('id_lang', 1)->first()->name;

    }

Итак, мой запрос возвращает результаты для ajax, и он используется для обработки данных. Поэтому я передаю json как конечный sh результат. Нет проблем с выбором поля базы данных classi c - проблема возникает только тогда, когда мне нужно использовать отношение для получения имен операторов.

Если я делаю что-то наподобие списка заказов, и вызываю $ order-> carrier-> getName () я получу имя оператора без проблем. Но в моем запросе я использую getName () в контексте 20 разбитых на страницы результатов, и я не уверен, как создать правильный запрос sql.

В каждом заказе есть один носитель. Каждый перевозчик имеет несколько переводов. Функция GetName возвращает перевод по умолчанию.

1 Ответ

1 голос
/ 28 февраля 2020

Проблема в том, что метод getName () предназначен для модели Carrier, а не для построителя запросов, поэтому вы должны определить отношение к имени доступа с переводом

// Carrier class
public function translationEng() // let think id_lang=1 is English
{
    return $this->translation()->where('id_lang', 1);
}

// in controller
public function loadOrders()
{
    $orders = Order::select('id', 'reference', 'created_at','total_value')->with(['carrier' => function($carrier){
        $carrier->with(['translationEng' => function($query){
            $query->select('name');
        }]);
    }])->paginate(20);

    return $orders;
}

// you can access the name this way
foreach($orders as $order)
{
    $carrierName = $order->carrier->translationEng->name;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...