Используйте accessor.
Я думаю, что вам нужно что-то вроде latest
, first
, или такого рода один элемент из коллекции, так что вы можете сделать это:
public function items()
{
return $this->belongsToMany(Item::class);
}
public function getLatestItemAttribute()
{
return $this->items->sortByDesc('created_at')->first();
}
, то вы можете просто использовать:
$yourModel->latestItem; // single related model OR null
Редактировать: как упоминалось в комментарии в комментарии @Hkan, приведенный выше код приведет к сбору всей коллекции и работе над ней. Тем не менее, вы можете использовать в качестве альтернативы отношение объекта и непосредственно запрос к таблице:
public function getLatestItemAttribute()
{
return $this->items()->latest()->first();
}
однако, таким образом, вы запустите запрос каждый раз, когда вы называете $model->latestItem
. В результате вы получаете новую копию модели, а не тот же экземпляр, и, очевидно, вы можете запросить свою базу данных произвольное количество раз, в зависимости от вашего прецедента.
жесткий, но лучше способом было бы имитировать отношения:
public function getLatestItemAttribute()
{
if (!$this->relationLoaded('latestItem')) {
$this->setRelation('latestItem', $this->items()->latest()->first());
}
return $this->getRelation('latestItem');
}
в этом случае $model->latestItem
рассматривается как любые другие одного отношений, когда загружен. То есть, это будет единственный экземпляр, когда вы вызываете аксессуар и будете сохраняться при использовании метода push
.
Можете ли вы разместить свой код, пожалуйста? –