belongsTo是怎么工作的?
我要做一个对数据进行评分的项目,每个project下面有一个数据表Data和一个评分表Score,每一条score都对应一个data,我想在调出一个score后通过belongsTo调用对应的data,请问如何让程序在执行return $this->belongsTo("App\ScoreCard\DataToScore");之前让data先执行setProject呢? 因为每一个project的data和score对应的数据表都不一样,具体到data,score模块中是通过setProject来指定对应表的。
大佬能不能告诉我如何实现,或者有其它更好的方案呢? 万分感谢!
以下为相关代码:
//this a method in controller:
public function show($id,Request $request)
{
$project = ScoreProject::findOrFail($request->get('project'));
$score=new Score;
return $score->setProject($project)->findOrFail($id)->data;
}
//below are the 2 models
class DataToScore extends Model
{
protected $project;
public function setProject(ScoreProject $project)
{
$this->project = $project;
$this->table = $project->data_to_score;
$this->fillable(explode(",", $project->data_fillable));
$this->project_id = $project->id;
return $this;
}
public function score()
{
return $this->hasOne("App\ScoreCard\Score", "data_id");
}
}
class Score extends Model
{
protected $project;
public function setProject(ScoreProject $project)
{
$this->project = $project;
$this->table = $project->score_save_to;
$this->fillable(explode(",",$project->score_fillable));
$this->project_id=$project->id;
return $this;
}
public function setData($id){
$this->data_id=$id;
return $this;
}
public function data(){
return $this->belongsTo("App\ScoreCard\DataToScore");
}
}
//project 对应模型,表名为score_projects
class ScoreProject extends Model
{
use \Illuminate\Database\Eloquent\SoftDeletes;
protected $fillable=['name', 'description', 'data_to_score', 'score_save_to','audit_save_to','data_fillable','audit_fillable','score_fillable'];
public function items(){
return $this->hasMany('App\ScoreCard\ScoreItem','project_id')->orderBy('order');
}
}
15 Comments
用关联关系把 project 和 data、score 串起来不就好了,何必要再多余设置呢
project 有对应的数据表和模型类吗
问题是每一个project都有一个data和一个score,而这个data和score对应的表是根据不同的project指定的。 比如: project1的data,score对应的表是video_data, video_score
而project2的data,score对应的表分别是audio_data, audio_score
有的
你这逻辑有点乱,根据你的描述,我理解的是每个 data 对应所属的 project,而 score 又归属于data,那它们之间都应该是父子关系啊 project <- data <- score,为什么又出现 data、score 所属的 project 不一致?
每个project都有一个data和一个score, 但是data和 score对应的表都是在他的project里设置的。
那就是 data 和 score 之间并无关联?
data和score都是在实例化的时候才能通过setProject设置它的表名的, 但是如果在一个已经实例化的score对象中,通过他的belongsTo调用data前,这个data是还没有设置其对应的表名的,这样他会默认以模块名去找表进而报错. 怎样从一个score的实例去调用belongsTo的data之前,先设置好这个data的table呢?
有关联,问题在于他们的表名都是存在project那里的,只有在实例化的时候才能从project那里先获取表名再进行其它操作。
score->data->project, score table = project->score_save_to; data table= project->data_to_score
有没有办法,在调用score的belongsTo(data)方法前,让data自动指定他的project为score的project。 因为他们肯定是属于一个project的。
如果这样无法实现的话,就只能弃用关系功能,每次都单独调用了。
带条件约束的这种渴求式加载满足不了你的需求?你可以在查询过程中动态设置查询条件的
啊,第一次听说这个,可否举个例子介绍一下呀
似乎不行,因为我的score对应表名只能在实例化时设置,应用渴求式加载会忽略你在实例化时设置的表名,而使用模型中的表名,我没有在模型中设置表名,他用了默认的 '模型名+s' 作表名来构建查询。 error:
SQLSTATE[42S02]: Base table or view not found: 1146 Table '***.scores' doesn't exist (SQL: select * from `scores`)
code: