라라벨 관계 초보자를 위해!외키는 기본 모드가 아닙니다!!!

10092 단어 Laravel관계.

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.php
class History extends Model
{
    public function status()
    {
        return $this->hasOne(Status::class, 'post_number');
    }
}
StatusController.php
namespace 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 KeybelongsTohasOne 상반된다면
공식 문서도 있어요.
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');
    }
}
따라서 반대belongsTohasOne하면 데이터를 잘 얻어 정확한 쓰기 결론을 내릴 수 있다.(※ 진피 씨가 가르쳐줬다)
참고로 외키가 기본값<テーブル名>_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());
결과 읽어들이기
bindings0 => 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 등으로 복사하여 요청한 기록을 얻었는지 확인합니다.

좋은 웹페이지 즐겨찾기