Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 05.04.2017 23:11:54

Не получается получить модель через связь

Версия Laravel:5.2

Версия PHP: 5.6

Операционная система и её версия: Windows 10 x64

Задача, что должно происходить _в целом_, техническое задание:
Есть структура таблицы:

diagnostic_centers
    id - integer
    name - string

diagnostic_centers_prices
    diagnostic_centers_id - integer
    service_id - integer
    price - integer

service_diagnostic_centers
    id - integer
    group_id - integer
    name - string

group_service_diagnostic_centers
    id - integer
    name - string

Нужно получить коллекцию моделей с данными из всех таблиц через модель Diagnostic_center.
Делаю вот так:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Diagnostic_center extends Model
{
    //
    public function diagnostic_centers_prices()
    {
        return $this->hasMany('App\Diagnostic_centers_price', 'diagnostic_centers_id', 'id');
    }

    public function service_diagnostic_centers()
    {
        return $this->hasManyThrough(
            'App\Service_diagnostic_center', 'App\Diagnostic_centers_price',
            'service_id', 'id', 'id'
        );
    }


}

diagnostic_centers_prices получаю а вот service_diagnostic_centers - пустая коллекция.

Помогите разобраться, перечитал доку про связи несколько раз но так и не получается разобраться(((

Не в сети

#2 06.04.2017 00:18:39

Re: Не получается получить модель через связь

Создайте модель, diagnostic_centers_prices и в ней отношение

public function service_diagnostic_centers()
    {
        return $this->hasMany('App\Service_diagnostic_centers', 'service_id', 'id');
    }

И в запросе используйте ->with('method')

Например:

$result = Diagnostic_center::with('diagnostic_centers_prices.service_diagnostic_centers')->get();

Вообще отношения в моделях лучше называть сокращенно, например prices и services, тогда Ваш код выглядел бы приятнее

$result = Diagnostic_center::with('prices.services')->get();

Изменено Illia (06.04.2017 00:20:09)

Не в сети

#3 06.04.2017 09:38:31

Re: Не получается получить модель через связь

Illia пишет:

Создайте модель, diagnostic_centers_prices и в ней отношение

public function service_diagnostic_centers()
    {
        return $this->hasMany('App\Service_diagnostic_centers', 'service_id', 'id');
    }

И в запросе используйте ->with('method')

Например:

$result = Diagnostic_center::with('diagnostic_centers_prices.service_diagnostic_centers')->get();

Вообще отношения в моделях лучше называть сокращенно, например prices и services, тогда Ваш код выглядел бы приятнее

$result = Diagnostic_center::with('prices.services')->get();

Я использую метод load() для передачи свойств. Вот код промежуточной функции:

protected  function getDiagnostics(){

        $diagnostics = $this->diagnostics_rep->get('*');

        if($diagnostics){
            $diagnostics->load('diagnostic_centers_prices', 'service_diagnostic_centers');
        }

        return $diagnostics;
    }

Добавил отношение в модель Diagnostic_centers_price. Прописал так:

if($diagnostics){
            $diagnostics->load('diagnostic_centers_prices', 'diagnostic_centers_prices.service_diagnostic_centers');
        }

Получаю ошибку "Call to undefined method Illuminate\Database\Query\Builder::service_diagnostic_centers()"
И так:

if($diagnostics){
            $diagnostics->load('diagnostic_centers_prices', 'service_diagnostic_centers');
        }

Все равно пустая коллекция приходит.

Изменено lahno (06.04.2017 09:41:39)

Не в сети

Подвал раздела