我正在尝试用他们的父模型加载两个模型。我得到了关系函数的空集。
以下是我加载模型的方法:
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_Question
,Version2015_Response
和Version2015_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
时它运行正常。当我创建responses
和master 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');
}
}
答案 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);
嗯,完成所有事情一切正常。我希望它可以帮助其他有类似问题的人。