Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用雄辩的ORM创建三向枢轴_Php_Mysql_Laravel_Eloquent_Laravel 5.7 - Fatal编程技术网

Php 如何使用雄辩的ORM创建三向枢轴

Php 如何使用雄辩的ORM创建三向枢轴,php,mysql,laravel,eloquent,laravel-5.7,Php,Mysql,Laravel,Eloquent,Laravel 5.7,对拉雷维尔来说很陌生,但我喜欢我目前所看到的 我正在开发一个应用程序,在这个应用程序中,客户可以参加会话,并且会话可以由许多客户参加。除此之外,客户还可以在他们单独参加的课程中完成评估(即一名客户=一项评估)。同样值得指出的是,他们可能会也可能不会完成评估 最好的解释方法是 还需要指出的是,数据必须是一致的——必须在有客户在场的会议上完成完整的评估。i、 e.客户必须出席会议-反之亦然-客户不可能完成他或她未出席会议的评估 这更多的是试图让我的头脑围绕着最好的结构,并使用Laravel中雄辩的

对拉雷维尔来说很陌生,但我喜欢我目前所看到的

我正在开发一个应用程序,在这个应用程序中,客户可以参加会话,并且会话可以由许多客户参加。除此之外,客户还可以在他们单独参加的课程中完成评估(即一名客户=一项评估)。同样值得指出的是,他们可能会也可能不会完成评估

最好的解释方法是

还需要指出的是,数据必须是一致的——必须在有客户在场的会议上完成完整的评估。i、 e.客户必须出席会议-反之亦然-客户不可能完成他或她未出席会议的评估

这更多的是试图让我的头脑围绕着最好的结构,并使用Laravel中雄辩的ORM。我知道我可以找到一个有效的解决方案,这肯定会是混乱和混乱的,但我宁愿知道正确的方法

一些相关代码:

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');
    }
}
我面临的问题是如何在“客户”、“会话”和“评估”之间建立这种三方关系,从而强制执行完整性并提供访问

我想了几件事:

  • 创建“客户端会话”透视表,并向其添加一个名为“评估id”的附加字段,并使用该字段将评估绑定到客户端和会话的唯一组合。我不确定如何(甚至是否可能)定义这种与没有模型的表的关系

  • 使用“评估”作为数据透视表。我真的不喜欢这个想法,因为可能不进行任何评估,但我仍然需要客户机和会话之间的关系,并且将其存储在“评估”中感觉是错误的

  • 创建一个单独的表“考勤”和一个相关的“数据透视类”,即扩展数据透视而不是模型-真的不确定这一个

  • 我已经设法使用简单的表来构造数据,并使用内部连接来远离Laravel,但我想了解如何最好地使用Elounting实现这一点

    我还看到了使用Pivot(即扩展Pivot而不是模型)或hasManyThrough()关系的belongToMany()关系

    我也看到了,但这已经有4年没有维护了,所以我想这可以用任何带有Elount/Laravel的船只来完成

    任何帮助,非常感谢

    ****更新****

    好的,@barghouthi对我的理解有很大帮助。目前,我的模型如下所示:

    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();
        }
    }