Laravel - как получить один экземпляр модели не как коллекцию, а как отдельную модель, принадлежащую ToMany - PullRequest
1 голос
/ 08 мая 2019

У меня есть это отношение, определенное в одной из моих моделей.Это самый простой возможный случай.

use \App\Models\Related;

public function entities()
{
    return $this
           ->belongsToMany(Entity::class, 'entity_related', 'related_id', 'entity_id');
}

Теперь я хочу создать отношение, которое получает только одну модель из таблицы.

Текущее решение

Я только что определил то же отношение, но с ->take(1).Грубый, но это работает.Спад этого решения заключается в том, что мне нужно сделать цикл foreach, чтобы получить желаемую единственную модель.

use \App\Models\Entity;

public function firstOfEntities()
{
    return $this
           ->belongsToMany(Entity::class, 'entity_related', 'related_id', 'entity_id')
           ->take(1); // <---
}

TO DO

Как правильно определить отношение, которое получает только один(просто любой) экземпляр модели, вместо создания коллекции?

Желаемое использование

После выполнения вышеизложенного я хочу иметь возможность использовать одну модель в моем файле шаблона внутри foreach цикл:

@foreach($object as $o)
    <h2>{{ $o->singleEntity->name }}</h2>
    <p>{{ $o->singleEntity->description}}</p>
@endforeach

1 Ответ

5 голосов
/ 08 мая 2019

Вы можете определить аксессор , чтобы получить свой первый элемент:

/** MyModel.php */

use \App\Models\Entity;

// Your current relationship
public function entities()
{
    return $this
       ->belongsToMany(Entity::class, 'entity_related', 'related_id', 'entity_id');
}

// the accessor
public function getFirstEntityAttribute()
{
    return $this->entities()->first();
}

Затем в вашем контроллере:

/** MyModelController.php */
$model = MyModel::find(1);
$entity = $model->first_entity;

Проверка документы, связанные с этой темой.

...