Несколько взаимосвязей в одной таблице с двумя столбцами Laravel - PullRequest
0 голосов
/ 24 апреля 2020

Если в книжном магазине нет книг на складе, этот книжный магазин может приобретать книги в другом книжном магазине, с которым у него есть контракт.

book_transfers Таблица выглядит следующим образом.

ID | sender_bookstore_id | delivery_bookstore_id 
1  | 2                   | 3  
2  | 1                   | 2  
3  | 3                   | 1

книги таблица

ID | store_name  
1  | London Garden Book Store
2  | Englaland Cafe Book
3  | Domesday Book Store           

Два столбца sender_bookstore_id и delivery_bookstore_id принадлежат одной таблице. Название этой таблицы книги.

Код моего контроллера ниже:

$data = BookTransfer::join('books', 'books.id', '=', 'book_transfers.sender_bookstore_id')
         ->select(
             'book_transfers.*',
             'book_transfers.sender_bookstore_id as sender_id',
             'book_transfers.delivery_bookstore_id as delivery_id',
             'books.store_name as sender_store_name'
         )
         ->groupBy('book_transfers.id')
         ->get();
         return $data;

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

Best Regards,

Ответы [ 2 ]

2 голосов
/ 24 апреля 2020

Использование отношения было бы намного проще.

// BookTransfer Model
public function sender(){
     return $this->belongsTo(Book::class, 'sender_bookstore_id');
}

public function delivery(){
     return $this->belongsTo(Book::class, 'delivery_bookstore_id ');
}

Ваш контроллер выглядел бы так

$data = BookTransfer::with(['sender', 'delivery'])->get();
1 голос
/ 24 апреля 2020

Если вы хотите получить данные по join, вы можете join снова эту же таблицу books и присвоить ей другое имя:

BookTransfer::join('books AS sender_books', 'sender_books.id', '=', 'book_transfers.sender_bookstore_id')
            ->join('books AS delivery_books', 'deliery_books.id', '=', 'book_transfers.delivery_bookstore_id')
            ->select(
                 'book_transfers.*',
                 'book_transfers.sender_bookstore_id AS sender_id',
                 'book_transfers.delivery_bookstore_id AS delivery_id',
                 'sender_books.store_name AS sender_store_name',
                 'delivery_books.store_name AS delivery_store_name'
             )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...