如何select 某些字段并通过查询关系存在进行排序? Laravel 5.3
How to select some field and order by on Querying Relationship Existence? Laravel 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;
}
有效
但是,order by 不起作用
另外,上面的查询,我只select一些字段。但是当我调试查询时,结果显示所有字段
好像还有错
有没有人可以帮助我?
我遵循这个教程: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');
}
}
收藏夹 table 有字段 ID,user_id,favoritable_id,favoritable_type
商店 table 有字段 ID、姓名、地址、电话、地址、电子邮件、照片
store和favorite的关系是id(storestable)和favoritable_id(favoritestable)
whereHas()
仅用于检查关系是否存在,因此,您必须使用 join()
对与 table
相关的结果进行排序
$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);
我还没有测试过,但我很确定它会起作用。
我的代码是这样的:
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;
}
有效
但是,order by 不起作用
另外,上面的查询,我只select一些字段。但是当我调试查询时,结果显示所有字段
好像还有错
有没有人可以帮助我?
我遵循这个教程: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');
}
}
收藏夹 table 有字段 ID,user_id,favoritable_id,favoritable_type
商店 table 有字段 ID、姓名、地址、电话、地址、电子邮件、照片
store和favorite的关系是id(storestable)和favoritable_id(favoritestable)
whereHas()
仅用于检查关系是否存在,因此,您必须使用 join()
对与 table
$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);
我还没有测试过,但我很确定它会起作用。