Laravel объединение отношений одной таблицы - PullRequest
0 голосов
/ 04 марта 2020

У меня есть модель Пользователь . У него есть 2 метода отношений.

 public function destinationTransaction()
    {
        return $this->hasManyThrough(
            Transaction::class,
            Account::class,
            'object_id',
            'destination_id'
        )->where('object_type', User::class);

И:

public function sourceTransaction()
    {
        return $this->hasManyThrough(
            Transaction::class,
            Account::class,
            'object_id',
            'source_id'
        )->where('object_type', User::class);
    }

Разница между ними только в secondKey (destination_id и source_id)

Я хочу создать метод транзакции , который будет возвращать результат sourceTransaction и destinationTransaction.

Пример:

public function transaction()
{
    $desTrn = $this->destinationTransaction;
    $srTrn= $this->sourceTransaction;

    // Merge collections and return single collection.
    return $competitionsHome->merge($srTrn);
}

This Метод не подходит, потому что он возвращает массив.

Может быть, вы можете как-то написать запрос с объединениями?

Ответы [ 2 ]

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

Кажется, users имеет много accounts на object_id, а accounts имеет много transactions на source_id или destination_id, и вы хотите объединить эти два в одно.

Вы можете использовать join для их соединения:

public function transaction() {
    return Account::join('users', 'users.id', 'accounts.object_id')
            ->where('accounts.object_id', $this->id)
            ->where('accounts.object_type', User::class)
            ->join('transaction AS destination', 'destination.id', 'accounts.destination_id')
            ->join('transaction AS source', 'source.id', 'accounts.source_id')
            // Now you can select the destination's columns and source columns with alias names:
            ->selectRaw('destination.*, source.column AS source_column, ...')
            ->get()
}
0 голосов
/ 04 марта 2020

Попробуйте объединение в вашем transaction() методе (не проверено):

public function transaction()
{
    return $this->destinationTransaction()->union($this->sourceTransaction()->toBase());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...