где отличается результат от подсчета по БД - PullRequest
0 голосов
/ 24 сентября 2019

Я есть: n отношений между Regions и Trees, с сводной таблицей tree_region;

Модель региона:

class Region extends Model
{
    protected $table = 'regions';
    public function trees()
    {
        return $this->belongsToMany( 'App\Models\Trees', 'tree_region', 'idTree', 'region' );    
    }    
}

Модель дерева:

class Tree extends Model
{
    protected $table = 'trees';
    public function regions()    {
        return $this->belongsToMany( 'App\Models\Region', 'tree_region', 'region', 'idTree' );
    }
}

В TreesController у меня есть функция, которую я использую для поиска деревьев по регионам:

public function treesByRegion(Request $request){
    $region = $request->region;
    $trees = Tree::whereHas('regions', function (Builder $query) use($region){
            $query->where('name', 'like','%'.$region.'%' );
        })->with('regions')->get();  
    return response()->json(count($trees));
}

Например, если я передаю строку, представленную в БД, результат отличается от:

SELECT count(*) FROM `tree_region` WHERE `region`=1

Выполняется через сводную таблицу db с тем же идентификатором, что и в строке «регионы».Что я не так?

1 Ответ

0 голосов
/ 24 сентября 2019

Кажется, это "нормальные" отношения многих ко многим.Каждый Region может иметь много разных Tree с, и каждый Tree может существовать во многих разных Region с.

Ваши отношения Eloquent уже установлены, поэтому я бы использовал их для всех вашихнеобходимо.Вы даже можете инкапсулировать это в метод, принадлежащий каждой родительской модели:

// Region.php

public function countTrees()
{
    return $this->trees()->count();
}

и

// Tree.php

public function countRegions()
{
    return $this->regions()->count();
}

Примечание: вызывая count() на regions() (в отличие от regions без ()) вычисления будут выполняться в SQL с помощью одного запроса.Подходит для одноразовых поисков, но не в масштабе из-за проблемы n + 1.

...