Как выбрать какое-либо поле и упорядочить его при запросе существования отношений? Ларавель 5.3

Мой код такой:

public function getFavoriteStore($param)
{
    $num = 20;
    $q = $param['q'];
    $location = $param['location'];

    $result = $this->store_repository->whereHas('favorites', function ($query) use($q, $location) {
        $query->select('stores.id', 'stores.name', 'stores.photo','stores.address')
              ->where('stores.status', '=', 1)
              ->where('favorites.favoritable_type', 'like', 'App\\\Models\\\Store');
        if($location)
           $query->where('stores.address', 'like', "%$location%");

        if($q) {
            $query->where('stores.name', 'like', "%$q%")
                  ->where('stores.address', 'like', "%$q%", 'or');
        }
        $query->orderBy('favorites.updated_at', 'desc');
    })->paginate($num);

    return $result;
}

Оно работает

Но заказ по не работает

Кроме того, в приведенном выше запросе я выбираю только какое-то поле. Но когда я отлаживаю запрос, результат отображает все поле

Кажется, все еще ошибаются

Есть ли кто-нибудь, кто может мне помочь?

Я следую этому руководству: https://laravel.com/docs/5.3/eloquent-relationships#querying-relationship-existence

ОБНОВЛЕНИЕ

Моя любимая модель вот такая:

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Favorite extends Model
{
    protected $fillable = ['user_id', 'favoritable_id', 'favoritable_type'];
    public function favoritable()
    {
        return $this->morphTo();
    }
}

Моя модель магазина выглядит так:

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Store extends Model
{   
    protected $fillable = ['name', 'address', 'phones', 'address', 'email'];
    public function favorites()
    {
        return $this->morphMany(Favorite::class, 'favoritable');
    }
}

Таблица избранного имеет идентификатор поля, user_id, Favoritable_id, Favoritable_Type

В таблице магазинов есть идентификатор поля, имя, адрес, телефоны, адрес, электронная почта, фото.

Отношение между магазином и избранным — это идентификатор (таблица магазинов) и Favoritable_id (таблица избранного).


person samuel toh    schedule 25.02.2017    source источник
comment
Я бы использовал панель отладки Laravel, чтобы посмотреть на фактически сгенерированный SQL и перейти оттуда.   -  person JC Lee    schedule 25.02.2017
comment
Какая связь между магазином и фаворитом?   -  person Amit Gupta    schedule 25.02.2017


Ответы (1)


whereHas() используется только для проверки существования отношения, поэтому вы должны использовать join() для упорядочения результатов со связанной таблицей.

$query = $this->store_repository
    ->join('favorites', function ($join) {
        $join->on('stores.id', '=', 'favorites.favoritable_id')
            ->where('favorites.favoritable_type', 'like', 'App\\\Models\\\Store');
    })
    ->where('stores.status', '=', 1)
    ->select('stores.id', 'stores.name', 'stores.photo','stores.address');

if($location)
    $query->where('stores.address', 'like', "%$location%");

if($q) {
    $query->where('stores.name', 'like', "%$q%")
        ->where('stores.address', 'like', "%$q%", 'or');
}

$result = $query->orderBy('favorites.updated_at', 'desc')->paginate($num);

Я не проверял это, но я уверен, что это сработает.

person Amit Gupta    schedule 25.02.2017
comment
Но я немного изменил ваш код. Вот так: if($location) $query = $query->where('stores.address', 'like', "%$location%"); if($q) { $query = $query->where('stores.name', 'like', "%$q%") ->where('stores.address', 'like', "%$q%", 'or'); } $query = $query->orderBy('favorites.updated_at', 'desc')->paginate($num);. Потому что существует ошибка: Object of class Illuminate\Database\Eloquent\Builder could not be converted to string - person samuel toh; 25.02.2017
comment
Как я указал в вашем предыдущем вопросе, вам не нужно хранить переменную $query для каждого предложения where. Можете ли вы снова проверить обновленный ответ. - person Amit Gupta; 25.02.2017
comment
@ Амит Гупта, прости. Существует ошибка: Missing argument 3 for Rinvex\Repository\Repositories\BaseRepository::join(). Я использую это: github.com/rinvex/repository - person moses toh; 10.04.2017
comment
@ Амит Гупта, мне нужна твоя помощь. Посмотрите на это: stackoverflow.com/questions/43780749/ - person samuel toh; 04.05.2017