2016-07-18 8 views
0

У меня есть эти схемы:Laravel связь belongsTo идентификатор не распознается

Schema::create('tickets', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->integer('ticket_reason_id')->unsigned(); 
    $table->integer('user_id')->unsigned(); 
    $table->timestamps(); 
    $table->foreign('ticket_reason_id')->references('id')->on('ticket_reasons')->onDelete('cascade'); 
    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 
}); 

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

И эти определенные отношения

class Ticket extends Model 
{ 

    public function user() 
    { 
     return $this->belongsTo(User::class); 
    } 

    public function reason() 
    { 
     return $this->belongsTo(TicketReason::class, 'ticket_reason_id'); 
    } 

} 

«разума» метод работает, но мне пришлось вручную добавить идентификатор. Почему я должен добавить идентификатор, если я следую конвенции? (или, по крайней мере, я так думаю). Он следует тому же соглашению, что и столбец user_id, и ему не нужен идентификатор.

+0

Возможно, это связано с подчеркиванием в имени таблицы? – Sam

+0

Это то, что я думал, но я ничего не мог найти в документации @Sam – Alan

+0

Я просто быстро прочитал документацию ... вы можете попробовать переименовать свою функцию 'Ticket' в' ticket_reason() 'и посмотреть, не работает ли она без указания внешний ключ? Если это так, я могу добавить это как ответ и ссылку на документацию. – Sam

ответ

1

Итак, я собираюсь назвать документацию Laravel Eloquent на этом ..., поскольку на самом деле не слишком понятно, как создается внешний ключ внешнего ключа. Я нашел это, из Eloquent Relationships page, хотя (курсив мой):

Eloquent будет пытаться соответствовать user_id от Phone модели к id на User модели. Eloquent определяет имя внешнего ключа по умолчанию , изучая имя метода отношений и суффикс имени метода с _id.

В отличие от того, что может (предположим, я и т. Д.), Внешний ключ не генерируется именем иностранного класса. Вместо этого он использует имя метода, что ваш ::belongsTo() (или hasOne() и т.д.) вызов находится.


Это означает, что public function reason() {} должен быть изменен на public function ticket_reason() {}. Или, конечно же, вы можете изменить название столбца на reason_id.

+0

Awesome, спасибо! – Alan

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

  • Нет связанных вопросов^_^