How to use orderBy() with model's method in Laravel
How can I use orderBy to order by a model's method?
Consider the model User and the method
public function fullName() {
return $this->firstName . $this->lastName;
}
I want to do something like orderBy('fullName'). Is this possible? I know I can make equivalent code using Query Builder, but I want to keep my Model methods as they are.
laravel laravel-5 eloquent laravel-query-builder
add a comment |
How can I use orderBy to order by a model's method?
Consider the model User and the method
public function fullName() {
return $this->firstName . $this->lastName;
}
I want to do something like orderBy('fullName'). Is this possible? I know I can make equivalent code using Query Builder, but I want to keep my Model methods as they are.
laravel laravel-5 eloquent laravel-query-builder
short answer, no, thats not possible.orderBy()
will be translated into SQLOrder BY
which it have no idea about yourfullname()
.. as last resort, you may consider usingDB::raw()
to concat things.
– Bagus Tesa
Nov 23 '18 at 0:50
so I'll have to use DB:raw() to rewrite all of my methods
– Josh
Nov 23 '18 at 0:52
sadly yes, or you may use denormalization trick instead. create a column namedfullname
and have it assigned every model saving.. oh wait they hadorderByRaw
on 5.7 - probably can do something like->orderByRaw('CONCAT(firstname, lastname)')
, may i know what version of your Laravel?
– Bagus Tesa
Nov 23 '18 at 0:55
I'm using 5.7. I would like to keep my existing methods, but it seems I'll have to code them using DB:raw().
– Josh
Nov 23 '18 at 0:57
no, you still have thatorderByRaw
:(
– Bagus Tesa
Nov 23 '18 at 1:14
add a comment |
How can I use orderBy to order by a model's method?
Consider the model User and the method
public function fullName() {
return $this->firstName . $this->lastName;
}
I want to do something like orderBy('fullName'). Is this possible? I know I can make equivalent code using Query Builder, but I want to keep my Model methods as they are.
laravel laravel-5 eloquent laravel-query-builder
How can I use orderBy to order by a model's method?
Consider the model User and the method
public function fullName() {
return $this->firstName . $this->lastName;
}
I want to do something like orderBy('fullName'). Is this possible? I know I can make equivalent code using Query Builder, but I want to keep my Model methods as they are.
laravel laravel-5 eloquent laravel-query-builder
laravel laravel-5 eloquent laravel-query-builder
edited Nov 24 '18 at 19:05
Josh
asked Nov 23 '18 at 0:48
JoshJosh
268
268
short answer, no, thats not possible.orderBy()
will be translated into SQLOrder BY
which it have no idea about yourfullname()
.. as last resort, you may consider usingDB::raw()
to concat things.
– Bagus Tesa
Nov 23 '18 at 0:50
so I'll have to use DB:raw() to rewrite all of my methods
– Josh
Nov 23 '18 at 0:52
sadly yes, or you may use denormalization trick instead. create a column namedfullname
and have it assigned every model saving.. oh wait they hadorderByRaw
on 5.7 - probably can do something like->orderByRaw('CONCAT(firstname, lastname)')
, may i know what version of your Laravel?
– Bagus Tesa
Nov 23 '18 at 0:55
I'm using 5.7. I would like to keep my existing methods, but it seems I'll have to code them using DB:raw().
– Josh
Nov 23 '18 at 0:57
no, you still have thatorderByRaw
:(
– Bagus Tesa
Nov 23 '18 at 1:14
add a comment |
short answer, no, thats not possible.orderBy()
will be translated into SQLOrder BY
which it have no idea about yourfullname()
.. as last resort, you may consider usingDB::raw()
to concat things.
– Bagus Tesa
Nov 23 '18 at 0:50
so I'll have to use DB:raw() to rewrite all of my methods
– Josh
Nov 23 '18 at 0:52
sadly yes, or you may use denormalization trick instead. create a column namedfullname
and have it assigned every model saving.. oh wait they hadorderByRaw
on 5.7 - probably can do something like->orderByRaw('CONCAT(firstname, lastname)')
, may i know what version of your Laravel?
– Bagus Tesa
Nov 23 '18 at 0:55
I'm using 5.7. I would like to keep my existing methods, but it seems I'll have to code them using DB:raw().
– Josh
Nov 23 '18 at 0:57
no, you still have thatorderByRaw
:(
– Bagus Tesa
Nov 23 '18 at 1:14
short answer, no, thats not possible.
orderBy()
will be translated into SQL Order BY
which it have no idea about your fullname()
.. as last resort, you may consider using DB::raw()
to concat things.– Bagus Tesa
Nov 23 '18 at 0:50
short answer, no, thats not possible.
orderBy()
will be translated into SQL Order BY
which it have no idea about your fullname()
.. as last resort, you may consider using DB::raw()
to concat things.– Bagus Tesa
Nov 23 '18 at 0:50
so I'll have to use DB:raw() to rewrite all of my methods
– Josh
Nov 23 '18 at 0:52
so I'll have to use DB:raw() to rewrite all of my methods
– Josh
Nov 23 '18 at 0:52
sadly yes, or you may use denormalization trick instead. create a column named
fullname
and have it assigned every model saving.. oh wait they had orderByRaw
on 5.7 - probably can do something like ->orderByRaw('CONCAT(firstname, lastname)')
, may i know what version of your Laravel?– Bagus Tesa
Nov 23 '18 at 0:55
sadly yes, or you may use denormalization trick instead. create a column named
fullname
and have it assigned every model saving.. oh wait they had orderByRaw
on 5.7 - probably can do something like ->orderByRaw('CONCAT(firstname, lastname)')
, may i know what version of your Laravel?– Bagus Tesa
Nov 23 '18 at 0:55
I'm using 5.7. I would like to keep my existing methods, but it seems I'll have to code them using DB:raw().
– Josh
Nov 23 '18 at 0:57
I'm using 5.7. I would like to keep my existing methods, but it seems I'll have to code them using DB:raw().
– Josh
Nov 23 '18 at 0:57
no, you still have that
orderByRaw
:(– Bagus Tesa
Nov 23 '18 at 1:14
no, you still have that
orderByRaw
:(– Bagus Tesa
Nov 23 '18 at 1:14
add a comment |
2 Answers
2
active
oldest
votes
I think you have a few options here:
- Create a view in your database, which has the column
fullName
. Then change your model to use the view. - Create a computed column fullName so that on insert if will use the values given from firstName and lastName.
- Use Laravel's Collection class. This class provides a sortBy method which you can use an attributes.
If you go with option 2, first define an attribute:
public function getFullNameAttribute()
{
return $this->firstName . $this->lastName;
}
Then using Laravel's Collection:
$items = Model::all()->sortBy('FullName');
Note: The default option for sortBy
is ascending, so if you wish to sort descending:
$items = Model::all()->sortByDesc('FullName');
You can read more about accessors here: https://laravel.com/docs/5.7/eloquent-mutators#defining-an-accessor
I can't use sortBy, because I'm using pagination and Collections don't have pagination.
– Josh
Nov 23 '18 at 12:11
add a comment |
I've solved the problem with this solution:
$sorted = User::get()
->sortBy('full_name') //appended attribute
->pluck('id')
->toArray();
$orderedIds = implode(',', $sorted);
$result = DB::table('user')
->orderByRaw(DB::raw("FIELD(id, ".$orderedIds." )"))
->paginate(10);
I've appended fullName attribute to the model, to be used by sortBy.
With this solution I was able to use orderBy to order by an appended attribute of the model, exactly what I wanted to do. So yes, it is possible. And also I was able to use pagination. Thanks to all who tried to help.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53439483%2fhow-to-use-orderby-with-models-method-in-laravel%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
I think you have a few options here:
- Create a view in your database, which has the column
fullName
. Then change your model to use the view. - Create a computed column fullName so that on insert if will use the values given from firstName and lastName.
- Use Laravel's Collection class. This class provides a sortBy method which you can use an attributes.
If you go with option 2, first define an attribute:
public function getFullNameAttribute()
{
return $this->firstName . $this->lastName;
}
Then using Laravel's Collection:
$items = Model::all()->sortBy('FullName');
Note: The default option for sortBy
is ascending, so if you wish to sort descending:
$items = Model::all()->sortByDesc('FullName');
You can read more about accessors here: https://laravel.com/docs/5.7/eloquent-mutators#defining-an-accessor
I can't use sortBy, because I'm using pagination and Collections don't have pagination.
– Josh
Nov 23 '18 at 12:11
add a comment |
I think you have a few options here:
- Create a view in your database, which has the column
fullName
. Then change your model to use the view. - Create a computed column fullName so that on insert if will use the values given from firstName and lastName.
- Use Laravel's Collection class. This class provides a sortBy method which you can use an attributes.
If you go with option 2, first define an attribute:
public function getFullNameAttribute()
{
return $this->firstName . $this->lastName;
}
Then using Laravel's Collection:
$items = Model::all()->sortBy('FullName');
Note: The default option for sortBy
is ascending, so if you wish to sort descending:
$items = Model::all()->sortByDesc('FullName');
You can read more about accessors here: https://laravel.com/docs/5.7/eloquent-mutators#defining-an-accessor
I can't use sortBy, because I'm using pagination and Collections don't have pagination.
– Josh
Nov 23 '18 at 12:11
add a comment |
I think you have a few options here:
- Create a view in your database, which has the column
fullName
. Then change your model to use the view. - Create a computed column fullName so that on insert if will use the values given from firstName and lastName.
- Use Laravel's Collection class. This class provides a sortBy method which you can use an attributes.
If you go with option 2, first define an attribute:
public function getFullNameAttribute()
{
return $this->firstName . $this->lastName;
}
Then using Laravel's Collection:
$items = Model::all()->sortBy('FullName');
Note: The default option for sortBy
is ascending, so if you wish to sort descending:
$items = Model::all()->sortByDesc('FullName');
You can read more about accessors here: https://laravel.com/docs/5.7/eloquent-mutators#defining-an-accessor
I think you have a few options here:
- Create a view in your database, which has the column
fullName
. Then change your model to use the view. - Create a computed column fullName so that on insert if will use the values given from firstName and lastName.
- Use Laravel's Collection class. This class provides a sortBy method which you can use an attributes.
If you go with option 2, first define an attribute:
public function getFullNameAttribute()
{
return $this->firstName . $this->lastName;
}
Then using Laravel's Collection:
$items = Model::all()->sortBy('FullName');
Note: The default option for sortBy
is ascending, so if you wish to sort descending:
$items = Model::all()->sortByDesc('FullName');
You can read more about accessors here: https://laravel.com/docs/5.7/eloquent-mutators#defining-an-accessor
answered Nov 23 '18 at 4:59
adamadam
949811
949811
I can't use sortBy, because I'm using pagination and Collections don't have pagination.
– Josh
Nov 23 '18 at 12:11
add a comment |
I can't use sortBy, because I'm using pagination and Collections don't have pagination.
– Josh
Nov 23 '18 at 12:11
I can't use sortBy, because I'm using pagination and Collections don't have pagination.
– Josh
Nov 23 '18 at 12:11
I can't use sortBy, because I'm using pagination and Collections don't have pagination.
– Josh
Nov 23 '18 at 12:11
add a comment |
I've solved the problem with this solution:
$sorted = User::get()
->sortBy('full_name') //appended attribute
->pluck('id')
->toArray();
$orderedIds = implode(',', $sorted);
$result = DB::table('user')
->orderByRaw(DB::raw("FIELD(id, ".$orderedIds." )"))
->paginate(10);
I've appended fullName attribute to the model, to be used by sortBy.
With this solution I was able to use orderBy to order by an appended attribute of the model, exactly what I wanted to do. So yes, it is possible. And also I was able to use pagination. Thanks to all who tried to help.
add a comment |
I've solved the problem with this solution:
$sorted = User::get()
->sortBy('full_name') //appended attribute
->pluck('id')
->toArray();
$orderedIds = implode(',', $sorted);
$result = DB::table('user')
->orderByRaw(DB::raw("FIELD(id, ".$orderedIds." )"))
->paginate(10);
I've appended fullName attribute to the model, to be used by sortBy.
With this solution I was able to use orderBy to order by an appended attribute of the model, exactly what I wanted to do. So yes, it is possible. And also I was able to use pagination. Thanks to all who tried to help.
add a comment |
I've solved the problem with this solution:
$sorted = User::get()
->sortBy('full_name') //appended attribute
->pluck('id')
->toArray();
$orderedIds = implode(',', $sorted);
$result = DB::table('user')
->orderByRaw(DB::raw("FIELD(id, ".$orderedIds." )"))
->paginate(10);
I've appended fullName attribute to the model, to be used by sortBy.
With this solution I was able to use orderBy to order by an appended attribute of the model, exactly what I wanted to do. So yes, it is possible. And also I was able to use pagination. Thanks to all who tried to help.
I've solved the problem with this solution:
$sorted = User::get()
->sortBy('full_name') //appended attribute
->pluck('id')
->toArray();
$orderedIds = implode(',', $sorted);
$result = DB::table('user')
->orderByRaw(DB::raw("FIELD(id, ".$orderedIds." )"))
->paginate(10);
I've appended fullName attribute to the model, to be used by sortBy.
With this solution I was able to use orderBy to order by an appended attribute of the model, exactly what I wanted to do. So yes, it is possible. And also I was able to use pagination. Thanks to all who tried to help.
answered Nov 24 '18 at 19:05
JoshJosh
268
268
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53439483%2fhow-to-use-orderby-with-models-method-in-laravel%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
short answer, no, thats not possible.
orderBy()
will be translated into SQLOrder BY
which it have no idea about yourfullname()
.. as last resort, you may consider usingDB::raw()
to concat things.– Bagus Tesa
Nov 23 '18 at 0:50
so I'll have to use DB:raw() to rewrite all of my methods
– Josh
Nov 23 '18 at 0:52
sadly yes, or you may use denormalization trick instead. create a column named
fullname
and have it assigned every model saving.. oh wait they hadorderByRaw
on 5.7 - probably can do something like->orderByRaw('CONCAT(firstname, lastname)')
, may i know what version of your Laravel?– Bagus Tesa
Nov 23 '18 at 0:55
I'm using 5.7. I would like to keep my existing methods, but it seems I'll have to code them using DB:raw().
– Josh
Nov 23 '18 at 0:57
no, you still have that
orderByRaw
:(– Bagus Tesa
Nov 23 '18 at 1:14