2016-10-21 2 views
1

У меня возникают проблемы с вылетом ИКАО и ИКАО прибытия из таблицы расписаний. Ларавел продолжает давать мне ошибки, что мои отношения прищурены. Вот код.Яркие множественные внешние ключи из одной таблицы в двух столбцах

Schema::create('airports', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->string('name'); 
     $table->string('city'); 
     $table->string('country'); 
     $table->string('iata'); 
     $table->string('icao'); 
     $table->double('lat'); 
     $table->double('lon'); 
     $table->longText('data')->nullable(); //JSON Data for All gate information for the system. 
     $table->softDeletes(); 
    }); 
Schema::create('schedule_templates', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->string('code'); 
     $table->string('flightnum'); 
     $table->integer('depicao')->unsigned(); 
     $table->foreign('depicao')->references('id')->on('airports')->onDelete('cascade'); 
     $table->integer('arricao')->unsigned(); 
     $table->foreign('arricao')->references('id')->on('airports')->onDelete('cascade'); 
     $table->string('aircraft')->nullable(); 
     $table->boolean('seasonal'); 
     $table->date('startdate'); 
     $table->date('enddate'); 
     $table->time('deptime'); 
     $table->time('arrtime'); 
     $table->integer('type'); 
     $table->boolean('enabled'); 
     $table->text('defaults'); 
     $table->timestamps(); 
     $table->softDeletes(); 
    }); 

Вот Модели

class ScheduleTemplate extends Model 
{ 
    public $table = "schedule_templates"; 

    public function depicao() 
    { 
     return $this->hasOne('App\Models\Airport', 'depicao'); 
    } 
    public function arricao() 
    { 
     return $this->hasOne('App\Models\Airport', 'arricao'); 
    } 
} 

class Airport extends Model 
{ 
    // 
    public $timestamps = false; 

    public function schedules() 
    { 
     return $this->belongsToMany('App\ScheduleTemplate'); 
    } 
} 

При попытке запроса, используя следующий код, я получаю ошибку

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'vaos_airports.depicao' in 'where clause' (SQL: select * from vaos_airports where vaos_airports . depicao in (1))

$schedules = ScheduleTemplate::with('depicao')->with('arricao')->get(); 

Конечной целью является вывести результаты в таблицу. Вот этот код, если он заинтересован.

@foreach($schedules as $s) 
    <tr> 
      <td>{{$s->code}}</td> 
      <td>{{$s->flightnum}}</td> 
      <td>{{$s->depicao()->name}}</td> 
      <td>{{$s->arricao()->name}}</td> 
      <td>{{$s->aircraft}}</td> 
      <td>{{$s->seasonal}}</td> 
      <td>{{$s->type}}</td> 
    </tr> 
@endforeach 

EDIT:

Я исправил проблему отношения Видимо я их местами. Вот обновленные классы моделей

class ScheduleTemplate extends Model 
{ 
    public $table = "schedule_templates"; 

    public function depicao() 
    { 
     return $this->belongsTo('App\Models\Airport', 'depicao'); 
    } 
    public function arricao() 
    { 
     return $this->belongsTo('App\Models\Airport', 'arricao'); 
    } 
} 

class Airport extends Model 
{ 
    // 
    public $timestamps = false; 

    public function schedules() 
    { 
     return $this->hasMany('App\ScheduleTemplate'); 
    } 
} 

Ошибка теперь находится в файле вида. Я либо получить ошибку BelongsTo:

Undefined property: Illuminate\Database\Eloquent\Relations\BelongsTo::$name

или это, если у меня есть arricao или depicao без «()»

Trying to get property of non-object

ответ

2

Дело в том, что второй аргумент отношения должны быть иностранные и второй - локальный ключ.

Из документов:

return $this->hasOne('App\Phone', 'foreign_key', 'local_key'); 

Так что в вашем случае, попробуйте следующее:

public function depicao() 
{ 
    return $this->hasOne('App\Models\Airport', 'id', 'depicao'); 
} 
public function arricao() 
{ 
    return $this->hasOne('App\Models\Airport', 'id', 'arricao'); 
} 

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

  1. Попытайтесь получить первый объект из отношений, вот так. Но обратите внимание: нетерпевая загрузка не будет работать!

    <td>{{$s->depicao()->first()->name}}</td> <td>{{$s->arricao()->first()->name}}</td>

  2. переименованиих отношения или столбцы, чтобы они не перекрывали друг друга текущих имен столбцов. Это, безусловно, лучший вариант.

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

+0

Пробовал выше, а также мое редактирование. Получите эту ошибку с помощью своего решения –

+0

> Неопределенное свойство: Illuminate \ Database \ Eloquent \ Relations \ HasOne :: $ name –

+0

Проверено ваше обновление.Он возвращается без ошибок, но возвращается дважды из одной записи. У меня есть Portland International как отправление, так и прибытие (это означает, что он вытаскивает первую запись из базы данных без проверки идентификатора). Я собираюсь попробовать второй вариант. –

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