Eager loaded model返回父模型属性的空集

时间:2016-07-13 13:52:42

标签: php laravel eloquent

我正在尝试用他们的父模型加载两个模型。我得到了关系函数的空集。

以下是我加载模型的方法:

Master_Key控制器(显示方法):

$master_keys = Version2015_Master_Key::with('version2015_question')->paginate(50);
            return view('masterkey/show',compact('master_keys'));

响应控制器(显示方法):

$responses = Version2015_Response::with('version2015_question')->paginate(50);
         return view('response/show',compact('responses'));

我想显示主密钥和响应以及匹配的问题。 以下是我的show.blade.php主密钥控制器的片段:

<table class="table">
        <tr>
          <th>Ref Number</th>
          <th>Question</th>
          <th>Expected Response</th>
          <th>Additional Information</th>
        </tr>

        @foreach ($master_keys as $master_key)
        <tr>
          <td>{{ $master_key->question_num }} </td>
          <td>{{ $master_key->version2015_question }} </td>
          <td>{{ $master_key->expected_response }} </td>
          <td>{{ $master_key->additional_information }} </td>
        </tr>
        @endforeach
      </table> 

<td>{{ $master_key->version2015_question }} </td>是唯一一个尝试显示父表数据的行。它实际应该是<td>{{ $master_key->version2015_question->question_text }} </td> - &gt;但是当我尝试这样做时,它会抛出一个错误,说我正在尝试从非对象访问属性。 <td>{{ $master_key->version2015_question }} </td>返回一个空集。所有其他属性都返回预期的数据(因为它们属于主密钥模型本身)。

有三种模式:Version2015_QuestionVersion2015_ResponseVersion2015_Master_Key。它们都在名称空间app\version2015中。我将只发布其中两个(因为Response和Master Key具有相同的结构和相同的行为):

问题模型

use Illuminate\Database\Eloquent\Model;

class Version2015_Question extends Model
{
    protected $table = 'Version2015_questions';
    protected $primaryKey = 'question_num';
    public $timestamps = false;

    public function version(){
        return $this->belongsTo('App\Version');
    }

    public function Version2015_responses(){
        return $this->hasMany('App\Version2015\Version2015_Response','question_num','question_num');
    }

    public function version2015_master_keys(){
        return $this->hasMany('App\Version2015\Version2015_Master_Key','question_num','question_num');
   }

    protected $fillable = ['question_num','question_text','version_id'];
}

响应模型:

namespace App\Version2015;
use Illuminate\Database\Eloquent\Model;
use App\Encryptable;

class Version2015_Response extends Model
    {
        use Encryptable;
        protected $fillable = ['response','additional_information', 'question_num', 'vendor_id', 'label_id', 'group_id'];

        protected $encryptable = ['response','additonal_information'];

        protected $table = 'version2015_responses';

        public $timestamps = false;

        public function version2015_question(){

        return $this->belongsTo('App\Version2015\Version2015_Question','question_num','question_num');
     }

    public function vendor(){
        return $this->belongsTo('App\Vendor');
    }

    public function group(){
        return $this->belongsTo('App\Group');
    }

    public function response_label(){
        return $this->belongsTo('App\Response_Label');
    }
}

我不打算发布迁移,因为此帖子中的代码太多了。当我运行php artisan migrate时它运行正常。当我创建responsesmaster keys时,questions表中引用的外键没有问题。所以我假设数据库方面没有问题。我相信它与模型和关系有关。我花了几个小时检查整个代码并查找其他线程。我没有得出任何结论,为什么它不从questions模型中提取问题数据。我在我的应用程序中使用许多其他模型进行此类查询,但它只发生在那三个 - 这恰好是他们自己的名称空间中的唯一。

    • 更新 - -

@MarcoAurélioDeleu要求的Version2015_question模型

namespace App\Version2015;

use Illuminate\Database\Eloquent\Model;

use App\Encryptable;

class Version2015_Master_Key extends Model
{
    use Encryptable;

    public $timestamps = false;

    protected $table = 'version2015_master_keys';

    protected $fillable = ['question_num','expected_response','group_id','label_id','additional_information'];

protected $encryptable = ['expected_response','additional_information'];

public function version2015_question(){
    //return $this->belongsTo('App\version2015\version2015_Question','question_num','question_num');
        return $this->belongsTo('App\Version2015\Version2015_Question');
    }

public function master_key_label(){
    return $this->belongsTo('App\Master_Key_Label');
}

public function group(){
    return $this->belongsTo('App\Group');
}
}

1 个答案:

答案 0 :(得分:0)

我找到了解决方案!我所要做的就是明确设置Laravel应该在父模型中寻找哪个主键,因为它不符合约定&#34; id&#34;但是&#34; question_number&#34;。我以前这样做但是有一个额外的参数return $this->belongsTo('App\version2015\version2015_Question','question_num','question_num');,然后我尝试了没有任何参数return $this->belongsTo('App\version2015\version2015_Question');。但是,我应该简单地指出父表中的主键是什么:return $this->belongsTo('App\version2015\version2015_Question','question_num');。另一个父表return $this->belongsTo('App\Master_Key_Label','label_id');也是如此。

除此之外,父表并不像我一样需要为他们的孩子做这个明确的定义:return $this->hasMany('App\version2015\version2015_Response','question_num','question_num');。它只需要子模型名称。

所以,这就是我的模型现在的样子:

问题模型

use Illuminate\Database\Eloquent\Model;

class Version2015_Question extends Model
{
    protected $table = 'Version2015_questions';
    protected $primaryKey = 'question_num';
    public $timestamps = false;

    public function version(){
        return $this->belongsTo('App\Version');
    }

    public function Version2015_responses(){
        return $this->hasMany('App\Version2015\Version2015_Response');
    }

    public function version2015_master_keys(){
        return $this->hasMany('App\Version2015\Version2015_Master_Key');
   }

    protected $fillable = ['question_num','question_text','version_id'];
}

响应模型:

namespace App\Version2015;
use Illuminate\Database\Eloquent\Model;
use App\Encryptable;

class Version2015_Response extends Model
    {
        use Encryptable;
        protected $fillable = ['response','additional_information', 'question_num', 'vendor_id', 'label_id', 'group_id'];

        protected $encryptable = ['response','additonal_information'];

        protected $table = 'version2015_responses';

        public $timestamps = false;

        public function version2015_question(){

        return $this->belongsTo('App\Version2015\Version2015_Question','question_num');
     }

    public function vendor(){
        return $this->belongsTo('App\Vendor');
    }

    public function group(){
        return $this->belongsTo('App\Group');
    }

    public function response_label(){
        return $this->belongsTo('App\Response_Label', 'label_id');
    }
}

主密钥模型与响应密钥相同。

我也注意到了另一个问题。出于某种原因,即使使用正确的设置,我也无法加载相关模型。 我的控制器有这个:

  $responses = version2015_Response::with('version2015_question')
  ->where('label_id','=',$label->id)
  ->paginate(50);

现在我必须这样做:

  $responses = version2015_Response::where('label_id','=',$label->id)
  ->paginate(50);

嗯,完成所有事情一切正常。我希望它可以帮助其他有类似问题的人。