Получить конкретное c поле от одной до многих табличных отношений с laravel eloquent? - PullRequest
0 голосов
/ 31 марта 2020

У меня есть таблица, подобная следующей: enter image description here

, поэтому у пользователя много balance_transactions, а последняя добавленная запись balance_transactions будет балансом аккаунта пользователя. мой вопрос, как заставить user model иметь свойство account_balance со значением, которое в последний раз вставлено total в balance_transactions таблицу

Я пытался использовать что-то подобное в пользовательской модели

public function balance {
    return $this->hasMany(App\BalanceTransaction::class);
}

public function account_balance {
    return $this->balance()->orderBy('id', 'DESC')->limit(1);
}

И Я получаю данные, подобные этим

$user = User::where('id', 1)->with('account_balance')->first();
return response()->json($user);

, и результат выглядит следующим образом json:

{
   "id": 1,
   "username": "john0131",
   "full_name": "john doe",
   "email": john@test.com,
   "account_balance": [
      {
          "id": 234,
          "user_id": 1,
          "total": 7850
          "added_value": 50
          "created_date": "2020-02-28 12:18:18"
      }
   ]
}

, но что я хочу, возвращаемое значение должно быть таким, как показано ниже json :

{
   "id": 1,
   "username": "john0131",
   "full_name": "john doe",
   "email": "john@test.com",
   "account_balance": 7850
}

мой вопрос, как сделать что-то подобное в laravel красноречивым правильным способом? поэтому я могу получить account_balance данные только с простым кодом, таким как $user = user::find(1);.

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Одним из способов решения этой проблемы является использование laravel аксессоров

Таким образом, в вашей пользовательской модели вы можете создать метод следующим образом

/**
 * Get the user's balance.
 *
 * @return float
 */
public function getAccountBalanceAttribute()
{
    return $this->balance->last()->total;
}

тогда, где бы вы ни захотели его использовать, вы можете использовать его: $ user-> account_balance;

0 голосов
/ 31 марта 2020

Я бы предложил загрузить только одну строку из таблицы транзакций, чтобы оценить производительность. Кроме того, вы можете добавить значение метода доступа к сериализованному выходу модели (например, __toArray()) и возвращать текущее значение, только если отношение уже загружено.

class User extends Authenticatable
{
    protected $appends = ['account_balance'];

    public function balance()
    {
        return $this->hasMany(App\BalanceTransaction::class);
    }

    public function latestBalance()
    {
        return $this
            ->hasOne(App\BalanceTransaction::class)
            ->latest();
    }

    public function getAcountBalanceAttribute()
    {
        if (! $this->relationLoaded('latestBalance')) {
            return null;
        }

        return $this->latestBalance->total;
    }
}
...