라라벨 관계 초보자를 위해!외키는 기본 모드가 아닙니다!!!
foreign_키는 <표 이름>_비 id 관계
일본어 문서 여기 있어요!
https://readouble.com/laravel/6.x/ja/eloquent-relationships.html
하고 싶은 일
일단 결론.
Status.php
class Status extends Model
{
public function history()
{
return $this->belongsTo(History::class, 'post_number');
}
}
History.phpclass History extends Model
{
public function status()
{
return $this->hasOne(Status::class, 'post_number');
}
}
StatusController.phpnamespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Status;
class StatusController extends Controller
{
public function index()
{
$statuses = Status::orderBy('created_at', 'asc')->paginate(10);
return view('status.index', compact('statuses'));
}
}
index.blade.php@foreach ($statuses as $status)
<tr>
<td>{{ optional($status->history)->post_id }}</td>
</tr>
@endforeach
어느 것이 belongsTo
입니까?이해하기 어려운 상황에서마피의 트위터 참고!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
"항상 두 번째 파라미터는 Foreign Key이고 세 번째 파라미터는 Local Key입니다. 기본적으로 Local Key를 만지작거리지 않으면'id'가 됩니다. 만약 어떤 표명이 있다면 Foreign Key를 기억하면 됩니다."
따라서 두 번째 매개 변수가
id
등 Local KeybelongsTo
와 hasOne
상반된다면공식 문서도 있어요.
return $this->hasOne('App\Phone', 'foreign_key', 'local_key');
실렸지만 여기가 중요한 것 같아요.내가 데이터를 가져온 책상 한쪽이
hasOne
!처음에 아래와 같이 하면 실제 데이터도 얻을 수 있다고 믿었기 때문이다. 그러나 이것이라면 Local Key가 제2의 매개 변수가 되는 것은 정확한 형식이 아니다!Status.php ❌
class Status extends Model
{
public function history()
{
return $this->hasOne(History::class, 'id', 'post_number');
}
}
문서를 따라서, 나는 아래가 정답인 줄 알았지만, 왠지 데이터를 얻을 수 없었다.Status.php ❓
class Status extends Model
{
public function history()
{
return $this->hasOne(History::class, 'post_number', 'id');
}
}
따라서 반대belongsTo
와hasOne
하면 데이터를 잘 얻어 정확한 쓰기 결론을 내릴 수 있다.(※ 진피 씨가 가르쳐줬다)참고로 외키가 기본값
<テーブル名>_id
이면 당길 필요가 없습니다.(
histories
표에 status_id
, 외부 키로 데이터를 얻으려는 경우)이번에는 다르기 때문에 파라미터를 분배합니다.
기본적으로 세 번째 파라미터는
id
의 형식이다return $this->belongsTo(History::class, 'post_number', 'id');
명명 규칙에 따라 세 번째 매개변수 id
는 기본값이므로 생략할 수 있습니다.return $this->belongsTo(History::class, 'post_number');
데이터가 확보되었는지 확인
\DB::enableQueryLog();
Status::find(1)->history;
dd(\DB::getQueryLog());
결과 읽어들이기bindings
의0 => 1
는'첫번째?
는1
'붙이면 밑에 ↓이 돼요.
select * from `statuses` where `statuses`.`id` = 1 limit 1;
select * from `histories` where `histories`.`id` = 18 and `histories`.`deleted_at` is null limit 1;
상기 내용을 heidiSQL이나 A5SQL 등으로 복사하여 요청한 기록을 얻었는지 확인합니다.
Reference
이 문제에 관하여(라라벨 관계 초보자를 위해!외키는 기본 모드가 아닙니다!!!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/saya1001kirinn/items/69e2146691101f92d57b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)