2013-07-04 6 views
0

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

  <table class="table"> 
       <thead> 
        <tr> 
         <th></th> 
         <th>Now Playing</th> 
         <th>Next Upcoming Show</th> 
        </tr> 
       </thead> 
       <tbody> 
       @foreach ($shows as $show) 
        <tr> 
        <td> 
         <strong>{{ $show->channel->name}}</strong></td> 
        <td><strong>{{ date('H:i', strtotime($show->now->start)) }}</strong> 
         {{ $show->now->title }}</td> 
        <td><strong>{{ date('H:i', strtotime($show->next->start)) }}</strong> 
         {{ $show->next->title }}</td> 
        </tr> 
       @endforeach   
       </tbody> 
      </table> 

я получаю сейчас играете шоу, как это: $ Приведена = Показать :: с ('канала') -> где ('начало', '< = ', DB :: raw (' (NOW() - INTERVAL 15 SECOND) ')) -> где (' end ','> ', DB :: raw (' (NOW() + INTERVAL 15 SECOND) ')) -> orderBy ('start') -> get();

Я не могу получить следующее предстоящее шоу каждого канала в том же запросе. было бы здорово, если бы я мог что-то подобное для текущего шоу: $ show-> now-> start и для следующего шоу: $ show-> next-> start

любые идеи?

Мой дб:

Schema::create('channels', function(Blueprint $table) {  
     $table->increments('id'); 
     $table->string('name', 200); 
     $table->timestamps(); 
    }); 

    Schema::create('shows', function(Blueprint $table) { 
     $table->increments('id'); 
     $table->integer('channel_id'); 
     $table->string('title', 255); 
     $table->text('description')->nullable(); 
     $table->dateTime('start'); 
     $table->dateTime('end'); 
    }); 
+1

Дополнительная информация о вашей структуре базы данных или даже необработанном запросе, который вы пытаетесь создать, наверняка поможет. – rmobis

ответ

0

Может быть, было бы легче сделать это наоборот? Петля его по каналам и делать $channel->next->... и $channel->now->...

В вашей Channel модели вы могли бы сделать что-то вроде:

public function next() 
{ 
    // Change this for your "get next" query 
    return $this->hasOne('Show')->where('start', '<=', DB::raw('(NOW() - INTERVAL 15 SECOND)')) ->where('end', '>', DB::raw('(NOW() + INTERVAL 15 SECOND)')) ->orderBy('start'); 
} 

public function now() 
{ 
    return $this->hasOne('Show')->where('start', '<=', DB::raw('(NOW() - INTERVAL 15 SECOND)')) ->where('end', '>', DB::raw('(NOW() + INTERVAL 15 SECOND)')) ->orderBy('start'); 
} 

Затем сделать:

$channels = Channel::with(array('next', 'now'))->get(); 

и

@foreach($channels as $channel) 
    Now: {{ $channel->now->title }} <br> 
    Next: {{ $channel->next->title }} 
@endforeach 

I не испытал это вообще, это всего лишь тысяча ХТ/предложение.

+0

Wow Jesper! это работает как шарм! не знал, что вы можете сделать это в Модели! Спасибо за помощь! –

Смежные вопросы