Laravel关系和数据透视表

时间:2019-12-16 16:06:30

标签: php laravel laravel-6

我正在开发我的第一个laravel应用,现在我正在为我的内容类型创建一些关系。

在应用程序中,我可以创建一个约会,该约会在执行过程中还将保存详细信息并创建一个新客户端。但是我希望我的用户能够看到其客户的“历史记录”,并查看他们已预订的所有约会。

到目前为止,我已经将hasMany关系添加到我的客户端模型,并且在约会模型中添加了hasOne逆。因此,到目前为止,我的想法是,一个客户可以有多个约会,而一个约会只能有一个客户。

但是...

我真的很难将两者连接在一起,因为理想情况下,我需要执行以下操作:-

对于X客户ID,获取所有与客户ID匹配的约会

在这种情况下,您将在哪里使用数据透视表进行管理?如果是这样,您在哪里放置逻辑以处理模型中ID的附加/取消附加?

或者我的呼叫中缺少某些内容,因为我的客户端模型中的约会函数只有以下内容:-

       return $this->hasMany('App\Appointment');

我还需要通过其他什么吗?

我已经阅读了文档,而且毫无头绪,并且来自WP背景,因此任何帮助都很棒!

3 个答案:

答案 0 :(得分:1)

由于您在谈论a one-to-many relationship,因此不需要数据透视表。相反,您的appointments表应该有一个client_id列,该列链接到客户端。

要获得客户的所有约会,您只需要获取appointments属性(假设您的关系方法也称为appointments()

$appointments = $client->appointments;

// OR

$appointments = \App\Client::find($client_id)->appointments;

由于该属性在类中不存在,因此Laravel将查找具有相同名称的关系方法。找到后,Laravel将在约会表中查询具有该客户ID的条目,并将其返回in a Collection

关系方法在存储新约会时也有帮助:

$client->appointments()->create(['date' => request('date'), ...]);

由于Laravel知道这种关系,因此您无需在约会中手动添加client_id

您在命名方法/表列等方面具有一定的灵活性,但是我通常发现最好坚持使用the Laravel conventions

答案 1 :(得分:1)

尝试这种方法

//In your Appointment Model
class Appointment extends Model
{
    public function client()
    {
        return $this->belongsTo('App\Client'); 
    }
}

//In your Client Model
class Client extends Model
{
    public function appointments()
    {
        return $this->hasMany('App\Appointment'); //if the foreign column in your appointments table is named different the client_id, the specify that column ('App\Appointment', 'id_of_client)
    }
    ...
}

// query to fetch client's appointments
$client = Client::findOrFail(1)->with(['appointments']);

答案 2 :(得分:0)

您可以在此处针对当前上下文使用一对多关系。

<?php
// Appointment model
class Appointment extends Model
{
    ...
    /**
     * Get the client associated with the Appointment.
     */
    public function client()
    {
        return $this->hasOne('App\Client', 'client_id');
    }
    ...
}

// client model
class Client extends Model
{
    ...
    /**
     * Get the Appointments associated with the client.
     */
    public function appointments()
    {
        return $this->hasMany('App\Appointment');
    }
    ...
}

// query to fetch client's appointments
Client::find(1)->with(['appointments']);