2015-11-25 2 views
3

Поскольку team_id необязательно в моей таблице билетов, я установил его как nullable, но по-прежнему является внешним ключом для таблицы команд, но когда я пытаюсь получить несколько строк билета с отношением к таблицы команд, билеты, у которых есть команда team_id, возвращаются правильно, но билеты, у которых есть null team_id, разрывают программу и возвращают эту ошибку «Попытка получить свойство не-объекта».Laravel отношения null внешний ключ выборки

миграции:

Schema::create('tickets', function (Blueprint $table) { 
    $table->integer('team_id')->unsigned()->nullable(); 
}); 

Schema::table('tickets', function (Blueprint $table) { 
    $table->foreign('team_id') 
      ->references('id') 
      ->on('teams'); 
}); 

модель Билет

public function team() 
{ 
    return $this->belongsTo('App\Models\Team', 'team_id', 'id'); 
} 

модель команды

public function tickets() 
{ 
    return $this->hasMany('App\Models\Ticket', 'id', 'team_id'); 
} 

Контроллер билетов

$tickets = Ticket::orderBy('created_at', 'desc') 
    ->take(10) 
    ->get(); 

foreach ($tickets as $ticket) { 
    var_dump($ticket->team->name); 
} 

ответ

2

Будет, потому что $ticket->team не существует для строк, где team_id - null.

Вы можете сделать это

foreach ($tickets as $ticket) { 
    if($ticket->team){ 
     var_dump($ticket->team->name); 
    } 
} 
+0

Спасибо за идеи, Исеть должна удалить ты, сог технически $ ticket-> команда установлена, она просто имела значение NULL. –

+1

Я не был уверен, что laravel вернул что-либо, если не было никакого отношения, принял изменение. Рад, что он подтолкнул вас в правильном направлении. – DavidT

0

Внешним ключом является внешний ключ при любых условиях, нет возможности реализовать условное ограничение внешнего ключа, которое будет выглядеть в таблице только тогда, когда оно не равно нулю. Лучший случай (или, вернее, худший случай), вы можете добавить значение NULL в таблицу первичных ключей, на которую он смотрит.