2017-10-20 8 views
1

Lumen 5.5.2 및 illuminate/database v5.5.17 사용.Eloquent relationship은 null을 반환하지만 비슷한 것이 좋습니다.

나는 3 개의 모델이 설정되어 있습니다. 하나는 다른 모델 2에 속해 있습니다. 따라서 견적에는 면적과 저장소가 있습니다.

저장소와의 관계가 예상대로 작동하면 영역은 null을 반환합니다. 이 목적이 아니기 때문에, 예

$quoteModel = new Quote();   
    $quote = $quoteModel 
      ->with('area') 
      ->with('depot') 
      ->where('id', '=', $id) 
      ->first(); 


    echo 'depot id : ' , $quote->depot->id , "<br>\n"; 
    echo 'area id : ' , $quote->area->id , "<br>\n"; 

디포 ID가 에코 될 것이기

는 영역은 오류가 발생할 것이다.

모델 이름을 배열 ->with(['area', 'depot'])으로 전달하거나 영역 요청 (두 가지 방법 모두)으로 문제가 해결되지 않습니다. 내가 Area.php에서 구문 분석 오류를 생성하는 경우

Quote.php

namespace App\Models; 

use Illuminate\Database\Eloquent\Model as EloquentModel; 

class Quote extends EloquentModel { 

    protected $table = 'quotes'; 

    public function area() { 
     return $this->belongsTo('\App\Models\Area', 'area_id', 'id'); 
    } 

    public function depot() { 
     return $this->belongsTo('\App\Models\Depot', 'depot_id', 'id'); 
    } 

} 

Area.php

namespace App\Models; 

use Illuminate\Database\Eloquent\Model as EloquentModel; 

class Area extends EloquentModel { 

    protected $table = 'areas'; 

    public $timestamps = false; 
    public $incrementing = false; 

    public function quotes() { 
     return $this->hasMany('\App\Models\Quote', 'area_id', 'id'); 
    } 

} 

Depot.php

namespace App\Models; 

use Illuminate\Database\Eloquent\Model as EloquentModel; 

class Depot extends EloquentModel { 

    protected $table = 'depots'; 

    public $timestamps = false; 
    public $incrementing = false; 

    public function quotes() { 
     return $this->hasMany('\App\Models\Quote', 'depot_id', 'id'); 
    } 

} 

스크립트가 입증 실패 그것이 포함됩니다.

쿼리를 기록 할 수 있도록 수신기가 설정되어있어 정상적으로 표시됩니다.

select * from `quotes` where `id` = 99192 limit 1 
select * from `areas` where `areas`.`id` in (072) 
select * from `depots` where `depots`.`id` in (07) 

수동으로 영역 쿼리를 실행하면 예상 한 행을 반환합니다.

지역 관계의 이름을 변경하려고 시도했지만 도움이되지 않습니다.

+1

웅변적인 버전을 사용하고 계십니까? 그들을 연결하는 대신 -> ([ 'area', 'depot'])을 사용해 보시겠습니까? – matiit

+0

버전 알림을 보내 주셔서 감사합니다. 그들은 글을 쓰는 시점에서 최신 버전입니다 (5.4에 있었고 업그레이드가 도움이되지 않았거나 다치게하지 못했습니다). - 제 질문을 업데이트했습니다. 슬프게도 배열 구문이 도움이되지 않았습니다 – CodeMonkey

답변

1

퍼즐의 누락 된 부분은이 프로젝트가 기존 웹 앱을 업데이트하는 과정에서 기존 데이터베이스에 대비하여 설정되었다는 것입니다.

일부 데이터 유형 불일치가있었습니다. 나는 문제없이 다른 모델을 성공적으로 연결할 수있을 때 이것을 발견했습니다. area_id에 대한 필드는 일반적으로 0으로 채워진 int이지만, 따옴표 테이블의 어떤 이유로 그것은 char이었습니다. 따라서 관리자가 탐색 할 때 데이터가 올바르게 보였고 복사 및 붙여 넣기 작업을 수행했지만 Eloquents 내부의 어딘가에 일치하지 않았습니다.

테이블의 데이터 유형을 변경하면 문제가 해결됩니다.

+0

당신이 그것을 알아 내서 반갑습니다! – matiit