Laravel принадлежит многим с дополнительными методами - PullRequest
0 голосов
/ 22 октября 2018

Для связи фолловеров на той же модели пользователя, которую я использовал belongsToMany()

public function followers() {
    return $this->belongsToMany('App\User', 'followers', 'follow_id', 'user_id');
}

Но так как я использую это для списка чата при загрузке с vue, я нахожусь на странице загрузки, проходящей json_encode(auth()->user()->followers), которая работает как янеобходимо.

Но когда я скажу, используя только некоторые столбцы, такие как:

->select(['id', 'name', 'avatar']);

У меня есть дополнительный метод для avatar:

public function image() {
    return $this->avatar || 'some-default-image';
}

Как я могу передать это также для каждого из многих?Без withDefault метода ..

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Попробуйте добавить это в вашу User модель

class User extends Model {

    protected $appends = ['image'];

    // other stuff..
}

, это принудительно добавит ваше вычисленное свойство, т.е.изображение в каждом User экземпляре модели, но для его работы вы должны назвать свой метод (или создать другой) как getImageAttribute(), а не просто image()

// getter for `image` property in user model object
public function getImageAttribute() { 
    return $this->avatar || 'some-default-image';
}
0 голосов
/ 22 октября 2018

Требуется функция Accessor:

Аксессоры и мутаторы Laravel

По сути, вы определяете функцию доступа вваша модель:

public function getAvatarAttribute($value)
{
    return $value || 'some-default-image';
}

Затем при доступе к свойству avatar с использованием ->avatar будет вызвана функция accessor, и вы получите вычисленное значение.

====================================================================

Комментарий ограничен количеством слов.

У вас есть таблица подписчиков, где каждый подписчик - User.Вы используете отношение, чтобы отфильтровать всех последователей, которые являются группой User с.Вы хотели, чтобы getInfo() вызывался для каждого подписчика, чтобы дополнительные данные добавлялись к вашей структуре JSON.

В этом случае вам не нужно фильтровать каждого подписчика и звонить getInfo() самостоятельно.Вы используете метод accessor, помещаете свой код в getInfo() в метод accessor и изменяете массив $appends в вашей модели User, после чего данные JSON будут автоматически добавляться.

public function getUserInfoAttribute()
{
    $userInfo = ... //use logic in your original getInfo method
    return $userInfo;
}

Затем вы добавляете user_info в $appends массив вашей User модели:

protected $appends = ['user_info'];

Таким образом, ваш user_info будет автоматически включен при сериализации вашего экземпляра в JSON.

Как я уже говорил в комментарии, вы должны проверить:

Добавление значений в JSON

для получения дополнительной информации.

Что касается API с, независимо от того, используете ли вы Vue или React или что-либо еще, при передаче данных JSON для вашего кода внешнего интерфейса вы в основном создаете api с.К вашему сведению:

Eloquent: ресурсы API

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...