Получить имя пользователя относительных данных, которые я прочитал, используя :: с - PullRequest
0 голосов
/ 28 января 2020

В Laravel 6, когда я читаю данные из таблицы объявлений, я использую :: with (чтобы получить относительные данные из таблицы ad_report_abuses (содержит поля id, ad_id, user_id, text), например "

$ads = Ad
    ::with('adReportAbuses')->
    getByTitle($this->filter_title)
    ->getByStatus('A')
    ->leftJoin('users', 'users.id', '=', 'ads.creator_id')
    ->orderBy($order_by, $order_direction)

    ->select(
        'ads.*',
        'users.name as creator_username',
        'users.email as creator_email',
        'users.phone as creator_phone'
    )

    ->offset($limit_start)
    ->take($ads_per_page)
    ->distinct()
    ->paginate($ads_per_page);

Который я выбираю с помощью ресурса:

class AdResource extends JsonResource
{
    public static $wrap = 'ads';
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->title,
            ...
            'adReportAbuses' => AdReportAbuse::collection($this->whenLoaded('adReportAbuses')),
            ...
            'created_at' => $this->created_at,
        ];
    }

В приложении / Ad. php модель у меня есть:

public function adReportAbuses()
{
    return $this->hasMany('App\AdReportAbuse', 'ad_id', 'id');
}

, и она работает нормально, а в подмассиве adReportAbuses у меня есть поля:

[0] => ad_id
[1] => user_id
[2] => text

, но мне также нужно в запросе adReportAbuses получить поле user_name для связанного adReportAbuses.user_id, и это другое отношение, которое я имею в основном запросе ad.user_id ... Могу ли я?

Спасибо !

1 Ответ

1 голос
/ 28 января 2020

Как я вижу, вам просто нужно изменить свой ресурс AdReportAbuse, чтобы включить пользователя. Этого можно достичь, добавив сначала отношение к модели AdReportAbuse.

class AdReportAbuse {
    public function user() {
        return $this->belongsTo(User::class);
    }
}

В ресурсе AdReportAbuse.

public function toArray() {
    // load the user from the adAbuseReport
    'user' => new UserResource($this->user),
}

Теперь в ваш ответ будут включены объявления со многими AdAbuseReports, в которых есть один пользователь. Для производительности вы можете обновить ваш вызов (). Вы объединяете данные в свою модель объявления. Этот подход также может избежать того, что в большинстве случаев объединение данных в Laravel является антишаблоном.

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