извлекать данные нескольких строк из нескольких таблиц в laravel 5.1

Работая над панелью управления администратором с использованием среды laravel 5.1, я застрял в середине разработки проекта.

Я не могу получить данные из нескольких таблиц с несколькими строками. Вот мой сценарий

Пожалуйста, проверьте эти изображения, которые являются моей структурой таблицы.

[1] Offer Table - saves all offers

введите здесь описание изображения

[2] Restaurant Table - Saves all restaurant information

введите здесь описание изображения

[3] OfferImage Table - Saves all offers images

введите здесь описание изображения

[4] FoodItem Table - saves all food items

введите здесь описание изображения

Я хочу отобразить все предложения, как показано на изображении 1, но делая это довольно сложно для меня.

Вот мой код контроллера

public function index()
{
  $alldata=Offer::all(); //this line is correct 

  $offerimage=Offer_image::all(); //this 3 lines are logically incorrect
  $restaurant=Restaurant::all();
  $fooditem=Food_item::all();
  return view('admin.listoffer',
  compact('alldata','offerimage','restaurant','fooditem'));
}

Это мой код в поле зрения

@foreach($alldata as $data)  
 <tr role="row" class="odd">
 <td class="sorting_1">{{ $data->offer_id }}</td>
 <td>{{ $offerimage->img_filename }} !!}</td>
 <td>{{ $restaurant->rest_name }}</td>
 <td>{{ $fooditem->item_name }}</td>
 <td>{{ $data->offer_code }}</td>
 <td>{{ $data->description }}</td>
 <td>{{ $data->total_price }}</td>
 <td>{{ $data->disc_value }}</td>
 <td>{{ $data->disc_percentage }}</td>
 <td>{{ $data->status }}</td>
 <td><a href="{{ Route('offer.edit',$data->rest_id) }}" class="btn btn-success">Edit</a><br> 

 {!! Form::open(array('route'=>['offer.destroy',$data->offer_id],'method'=>'delete')) !!}
 {!! Form::hidden('id',$data->offer_id) !!}
                    {!! Form::submit('Delete',$attributes=array('class'=>'btn btn-danger')) !!}
                {!! Form::close() !!}
  </td>
  </tr>
@endforeach

В приведенном выше контроллере, как мне написать код, чтобы я мог получить все строки из таблицы предложений, а также данные из других таблиц. Я искал документацию Laravel 5.1 и красноречивые отношения, но я не могу вписать этот тип в какие-либо отношения.

помощь действительно ценится.


person dollar    schedule 18.10.2015    source источник


Ответы (1)


Вам нужно связать эти модели друг с другом, чтобы сделать то, что вы хотите. В качестве примера рассмотрим отношения «Предложение — Ресторан».

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

Чтобы упростить эту связь, вам нужно добавить поле в таблицу «Предложение» для хранения идентификатора ресторана, к которому оно относится. Судя по коду блейда, у вас есть поле rest_id, в котором хранится идентификатор ресторана для предложения.

Как только вы добавите поле в таблицу «Предложение», вам нужно настроить отношения в ваших моделях, например:

class Offer extends Model {
    // second parameter is the field on the offer table
    // third parameter is the id field on the restaurant table
    public function restaurant() {
        return belongsTo('\App\Restaurant', 'rest_id', 'id');
    }
}

class Restaurant extends Model {
    // second parameter is the field on the offer table
    // third parameter is the id field on the restaur
    public function offers() {
        return hasMany('\App\Offer', 'rest_id', 'id');
    }
}

Теперь, когда отношения настроены правильно, вы можете получить доступ к соответствующей информации о ресторане из объекта предложения:

$offer = Offer::first();
$restaurant = $offer->restaurant;
$restaurantName = $offer->restaurant->rest_name;

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

$offer = Offer::with('restaurant', 'offerImage', 'foodItem')->first();
$restaurant = $offer->restaurant;
$restaurantName = $offer->restaurant->rest_name;

Надеюсь, это поможет вам начать работу, но было бы неплохо ознакомиться с документацией по отношениям.

Редактировать

изменить из-за комментариев

Выборка всех строк работает так же, как выборка одной строки. Единственное отличие состоит в том, что вы получаете коллекцию моделей для всех строк, а не одну модель для одной строки. Обратите внимание на использование метода get() вместо метода all(). all() — это метод быстрого доступа к модели, который просто создает объект построителя запросов и вызывает get(). Поскольку вы модифицируете запрос для выполнения (стремясь загрузить отношения), вы получаете экземпляр построителя запросов и вызываете get() для него, чтобы получить записи.

Итак, ваш код будет выглядеть так:

// get all offers, with their relationships eager loaded
$offers = Offer::with('restaurant', 'offerImage', 'foodItem')->get();

// loop through each offer; do what you need to do.
foreach($offers as $offer) {
    echo $offer->restaurant->rest_name;
}
person patricus    schedule 18.10.2015
comment
как вы сказали, я пытался, но в приведенном выше коде вы извлекаете первую строку таблицы, где я пытаюсь извлечь каждую и каждую строку из таблицы. поэтому у меня есть такой код $offer=Offer::all(); Как я могу получить rest_name для каждой строки, которая будет получена с помощью $offer=Offer::all(); - person dollar; 23.10.2015
comment
Ты помог мне, как бог. Мне понравилось ... Спасибо, все работает нормально, и я легко изучил концепцию отношений Eloquent с помощью предоставленного вами решения .... - person dollar; 23.10.2015