Php 如何使用雄辩的ORM创建三向枢轴
对拉雷维尔来说很陌生,但我喜欢我目前所看到的 我正在开发一个应用程序,在这个应用程序中,客户可以参加会话,并且会话可以由许多客户参加。除此之外,客户还可以在他们单独参加的课程中完成评估(即一名客户=一项评估)。同样值得指出的是,他们可能会也可能不会完成评估 最好的解释方法是 还需要指出的是,数据必须是一致的——必须在有客户在场的会议上完成完整的评估。i、 e.客户必须出席会议-反之亦然-客户不可能完成他或她未出席会议的评估 这更多的是试图让我的头脑围绕着最好的结构,并使用Laravel中雄辩的ORM。我知道我可以找到一个有效的解决方案,这肯定会是混乱和混乱的,但我宁愿知道正确的方法 一些相关代码:Php 如何使用雄辩的ORM创建三向枢轴,php,mysql,laravel,eloquent,laravel-5.7,Php,Mysql,Laravel,Eloquent,Laravel 5.7,对拉雷维尔来说很陌生,但我喜欢我目前所看到的 我正在开发一个应用程序,在这个应用程序中,客户可以参加会话,并且会话可以由许多客户参加。除此之外,客户还可以在他们单独参加的课程中完成评估(即一名客户=一项评估)。同样值得指出的是,他们可能会也可能不会完成评估 最好的解释方法是 还需要指出的是,数据必须是一致的——必须在有客户在场的会议上完成完整的评估。i、 e.客户必须出席会议-反之亦然-客户不可能完成他或她未出席会议的评估 这更多的是试图让我的头脑围绕着最好的结构,并使用Laravel中雄辩的
class Client extends Model
{
public function sessions()
{
return $this->hasMany('App\Session');
}
public function assessments()
{
return $this->hasMany('App\Assessment');
}
}
class Session extends Model
{
public function clients()
{
return $this->hasMany('App\Client');
}
public function assessments()
{
return $this->hasMany('App\Assessment');
}
}
//This is where I am having difficulty...
class Assessment extends Model
{
public function client()
{
return $this->hasOne('App\Client');
}
public function session()
{
return $this->hasOne('App\Session');
}
}
我面临的问题是如何在“客户”、“会话”和“评估”之间建立这种三方关系,从而强制执行完整性并提供访问
我想了几件事:
class Client extends Model
{
public function sessions()
{
return $this->belongsToMany('App\Session', 'attendance')->using('App\Attendance');
}
}
class Session extends Model
{
public function clients()
{
return $this->belongsToMany('App\Client', 'attendance')->using('App\Attendance');
}
}
class Attendance extends Pivot
{
public function client()
{
return $this->belongsTo('App\Client', 'attendance');
}
public function session()
{
return $this->belongsTo('App\Session', 'attendance');
}
public function assessment()
{
return $this->hasMany('App\Assessment','attendance');
}
}
class Assessment extends Model
{
public function attendance()
{
return $this->belongsTo('App\Attendance');
}
public function client()
{
// for now
return $this->attendance()->client();
}
public function session()
{
// for now
return $this->attendance()->session();
}
}
我特意重命名了pivot表,以反映pivot类
我在考勤表中输入了一些虚拟数据,以便:
当我在客户端会话中查询客户端ID 1时,将返回四个条目,而不是两个条目。就出勤表而言,“四”是正确的,但我只希望返回两条记录,即会议记录
****更新
好吧,我学了很多,但我还不太懂。这是我当前的解决方案:
class Client extends Model
{
public function sessions()
{
return $this->belongsToMany('App\Session', 'attendance')->using('App\Attendance')->distinct('session_id');
}
public function assessments()
{
return $this->hasManyThrough('\App\Assessment', '\App\Attendance', 'client_id', 'id');
}
}
class Session extends Model
{
public function clients()
{
return $this->belongsToMany('App\Client', 'attendance')->using('App\Attendance')->distinct('client_id');
}
public function assessments()
{
return $this->hasManyThrough('\App\Assessment', '\App\Attendance', 'session_id', 'id');
}
}
class Assessment extends Model
{
public function client()
{
return $this->belongsToMany('\App\Client', 'attendance', 'id', 'client_id')->using('\App\Attendance');
}
public function session()
{
return $this->belongsToMany('\App\Session', 'attendance', 'id', 'session_id')->using('\App\Attendance');
}
}
考勤表只包含id、客户机id和会话id。我认为没有必要评估\u id,因为存在一对一关系(即,客户可能在particualr会话上进行评估或不执行评估)
这似乎在很大程度上起了作用。如果我试着打电话
$assessment->client->id
我得到如下结论:
Property [id] does not exist on this collection instance.
这意味着如果我想阅读相关元素的属性,我在评估中的关系就不太正确
当我使用
$assessment->client
输出是
[{"id":1,"created_at":"2018-10-24 19:15:41","updated_at":"2018-10-24 19:15:41","date_of_birth":"26 Sep 1974","gender":1,"initial_contact_date":"2013-05-01","initial_session_offered_date":"2002-07-06","contact_from":1,"presentation":"Vitae qui et nesciunt iste autem numquam earum. Illo repudiandae deleniti vel nesciunt non iure. Sunt est nemo ut excepturi illum temporibus.","counsellor_id":1,"pivot":{"id":1,"client_id":1}}]
所以我猜我很接近了。所以如果您有
客户会话
或出席
表,该表具有id
,客户id
,会话id
,并且您将该表用作评估表中的外键
关键是数据透视表可以是一个模型
请参见:定义自定义中间表模型
class Client extends Model
{
public function sessions()
{
// using intermediate model
return $this->belongsToMany('App\Session')->using('App\Attendance');
}
}
class Session extends Model
{
public function clients()
{
// using intermediate model
return $this->belongsToMany('App\Session')->using('App\Attendance');
}
}
class Attendance extends Pivot
{
public function clients()
{
return $this->belongsTo('App\Client');
}
public function session()
{
return $this->belongsTo('App\Session');
}
public function Assessments()
{
return $this->hasMany('App\Assessment');
}
}
class Assessment extends Model
{
public function attendance()
{
return $this->belongsTo('App\Attendance');
}
public function client()
{
// for now
return $this->attendance()->client();
}
public function session()
{
// for now
return $this->attendance()->client();
}
}
因此,这样一来,如果没有出勤率和
出席可以有很多评估
评估结果如下:
id
,attention\u id
:指客户和会议这肯定让我走上了正确的轨道。非常感谢。有一件事(希望是最后一件!)让我很为难,那就是一个客户可能在一次会议中完成两次评估。这里的问题是,在提取会话时,它提供了两个记录,即Record\1:client\u id:1 session\u id:1 assessment\u id:1 Record\2:client\u id:1 session\u id:1 assessment\u id:2
数据是可靠的。我只需要一种方法来过滤它,这样它只会提取不同的会话,而不是每个“出席”记录。这一点都没有问题,一个评估属于一个出席,但出席可能有几个评估。事实上,我的回答有一个错误。评估是一个正常的模型(扩展模型),我现在就来修复它。我注意到了轴心问题,这意味着其中的一部分正在进行中!关于我上一次评论中的问题,这是因为关系返回的数据来自“出席”表,而不是结束“评估”表。数据是正确的,但我需要它来拉入不同的记录(一个la SQL),以便它只给我会话-而不是每个唯一组合的记录。如果你举一些例子,它会更容易理解!。为什么同一客户机和会话有两个考勤实例?
class Client extends Model
{
public function sessions()
{
// using intermediate model
return $this->belongsToMany('App\Session')->using('App\Attendance');
}
}
class Session extends Model
{
public function clients()
{
// using intermediate model
return $this->belongsToMany('App\Session')->using('App\Attendance');
}
}
class Attendance extends Pivot
{
public function clients()
{
return $this->belongsTo('App\Client');
}
public function session()
{
return $this->belongsTo('App\Session');
}
public function Assessments()
{
return $this->hasMany('App\Assessment');
}
}
class Assessment extends Model
{
public function attendance()
{
return $this->belongsTo('App\Attendance');
}
public function client()
{
// for now
return $this->attendance()->client();
}
public function session()
{
// for now
return $this->attendance()->client();
}
}