我的配置已经被阻止三天了。我无法按报告的模型排序,我尝试了很多方法但没有结论,例如 sortBy/sortByDesc、join table 但没有解决方案
我想执行分页、排序和服务器端过滤器。过滤器可以是多个。除了按相关模型排序外,一切正常
我得到的网址:http://127.0.0.1:8000/api/user/list?page=1&limit=30&sort=user__created_at&direction=desc&search__user__name=James&search__group__name=Client
查询search__model__col
允许我在多个模型或列上链接多个搜索
这是我的代码:
public static function pagination(Request $request, $model, $relation, $modelStringify)
{
$modelSortBy = explode('__', $request->query('sort'))[0]; // user
$tableSortBy = explode('__', $request->query('sort'))[1]; // created_at
$query = $request->query(); // ['page' => 1, 'limit' => 30...]
$direction = $request->query('direction'); // desc
try {
$model = $model->with($relation);
//TODO : orderBy relationship
if ($modelSortBy === $modelStringify): // modelStringify = 'user'
$model->orderBy($tableSortBy, $direction);
else:
// sort server side here
endif;
foreach (array_keys($query) as $q) {
if (strpos($q, 'search__') === 0) {
$modelSearchBy = explode('__', $q)[1]; // ['user', 'group']
$tableSearchBy = explode('__', $q)[2]; // ['name', 'name']
$valueSearchBy = $query[$q];
if ($modelSearchBy === $modelStringify):
$model->where($tableSearchBy, 'like', $valueSearchBy . '%');
else:
$model->whereHas($modelSearchBy, function (Builder $q) use ($valueSearchBy, $tableSearchBy) {
$q->where($tableSearchBy, 'like', $valueSearchBy . '%'); // $valueSearchBy = ['James', 'Client']
});
endif;
}
}
return $model;
} catch (Exception $e) {
return response()->json(['message' => $e], 400);
}
}
以下是 user
belongsTo
group
的示例:
return response()->json([
'items' => Utils::pagination($request, new User(), [
'group',
], 'user')->paginate($limit)->toArray()
]);
如何在此配置中引入按相关模型排序?
例如,对于按组名称排序,我得到 URL &sort=group__name
谢谢
最佳答案
看起来这在 Laravel 中并不容易完成。有人建议在 Laravel 中使用一种语法来执行此操作 here ,但泰勒关闭了该问题。
在所有其他资源上我可以找到人 suggest using joins ,但这不太适合您更通用的方法。
Laravel 最近还引入了“子查询增强功能”,其中包括按子查询值排序(在 this page 上搜索“Eloquent Subquery Improvements”),但我不知道如何使用它通过 Eloquent 关系进行排序更容易实现值(value)。
我认为你最好的选择是使用第三方软件包,例如从 Github 问题链接到的软件包 fico7489/laravel-eloquent-join 。安装后,您只需创建一个使用 use Fico7489\Laravel\EloquentJoin\Traits\EloquentJoin;
特征的新基本模型类,然后从模型继承该类。
use Fico7489\Laravel\EloquentJoin\Traits\EloquentJoin;
use Illuminate\Database\Eloquent\Model;
abstract class BaseModel extends Model
{
use EloquentJoin;
class ExampleModel extends BaseModel
然后您将能够使用 orderByJoin
按关系排序功能:
$model->orderByJoin('<relationship>.<column>', $direction);
上面的relationship
值将是您在模型上定义的关系的名称。
请记住,orderByJoin
函数仅支持 BelongsTo
和 HasOne
关系。
需要记住的一点是,Laravel 和 laravel-eloquent-join 包都不能保护您免受列名(或 orderByJoin 函数中的方向值)中的 SQL 注入(inject)。 Laravel docs建议您对列名称使用白名单:
PDO does not support binding column names. Therefore, you should never allow user input to dictate the column names referenced by your queries, including "order by" columns, etc. If you must allow the user to select certain columns to query against, always validate the column names against a white-list of allowed columns.
关于javascript - Laravel:如何使用分页和过滤器按相关模型进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59806135/