У меня есть несколько моделей, таких как Пользователь, Публикация, Комментарий и т. Д.

В User у меня есть:

public function posts() 
{
   return $this->hasMany('Post'); 
}

Я могу получить первое сообщение через $customer->posts()->first(), но что, если я хочу получить последнее сообщение? Как я вижу, нет last ().

Это дополнительно усугубляется отношением hasManyThrough (к сожалению, мы унаследовали дурацкую схему):

public function comments() 
{
     return $this->hasManyThrough('Comment', 'Post');
}

Если я попытаюсь выполнить $this->comments()->orderBy('comments.id', 'desc')->first();, он вернет объект User ??

11
StackOverflowed 17 Авг 2014 в 23:06
Вы пробовали $this->comments()->orderBy('id', 'desc')->first();?
 – 
Brobin
17 Авг 2014 в 23:16
Да, я получаю объект Post вместо комментария. Однако comments () возвращает соответствующие комментарии.
 – 
StackOverflowed
17 Авг 2014 в 23:21
Забавно то, что когда я использую var_dump, он думает , что возвращает комментарий (указанный объект является комментарием), но идентификатор и последующие поля относятся к сообщению.
 – 
StackOverflowed
17 Авг 2014 в 23:23
Покажите схему таблиц, если у вас есть такие проблемы.
 – 
Jarek Tkaczyk
17 Авг 2014 в 23:28

2 ответа

Лучший ответ

Не это

// User model
$this->comments()->orderBy('comments.id', 'desc')->first();

Не вернет модель User.

И чтобы получить то, что вы просили, просто сделайте следующее:

$customer->posts()->latest()->first();
25
Jarek Tkaczyk 17 Авг 2014 в 23:26
Извините, я оговорился. Он возвращал объект Post, одетый как комментарий. По сути, это был объект комментария, но все поля, относящиеся к объекту сообщения, к которому он присоединялся.
 – 
StackOverflowed
17 Авг 2014 в 23:28
Как и в моем предыдущем комментарии - покажите свои таблицы, потому что кажется, что у вас там что-то не так.
 – 
Jarek Tkaczyk
17 Авг 2014 в 23:29
Как мы можем повторно реализовать последний метод для работы с другим столбцом, например, updated_at, или добавить другой метод, который применяется к другим полям.
 – 
saber tabatabaee yazdi
4 Июл 2020 в 09:01

Вы сказали There is no last() as I can see, но на самом деле существует также метод last(), поэтому вы можете использовать его так:

$customer->posts->last();

Обратите внимание, что это не $customer->posts()->last(), как вы использовали в своем примере, используя first().

2
The Alpha 18 Авг 2014 в 00:48
latest() работает, только если в вашей таблице есть столбец created_at.
 – 
Lorand-Edmond Iszlai
28 Фев 2018 в 19:37
4
@ Lorand-EdmondIszlai latest() без параметра использует поле 'created_at', но можно использовать ЛЮБОЕ поле даты, передав его, например: latest('your_date_field')
 – 
Genki
9 Фев 2019 в 10:29
Это загрузит все сообщения в память, чтобы выбрать последнюю. Представьте себе миллион сообщений :) бум
 – 
Avram
6 Мар 2019 в 01:43
Вам следует уточнить, что это последний из коллекции, а не красноречивый запрос.
 – 
Surya
18 Янв 2021 в 04:01