如何在 Laravel 中获取给定订阅的第一个订单?

问题描述 投票:0回答:1

我在 Laravel 中有一个自定义计划订阅项目,我有以下模型: 订单:id、金额、plan_id 计划: ID、名称、价格 订阅:id、plan_id、starts_at、ends_at、subscriber_type、subscriber_id 客户:id、姓名

这里的subscriber_type是App\Models\Client,subscriber_id是客户端id

计划.php

class Plan extends Model implements Sortable
{  

    public function subscriptions(): HasMany
    {
        return $this->hasMany(Subscription::class);
    }
  ....
}

订阅.php

class Subscription extends Model{

public function plan(): BelongsTo
    {
        return $this->belongsTo(Plan::class);
    }

}

客户端.php

class Client extends Model{

    public function suscriptions(): MorphMany
    {
        return $this->morphMany(Subscription::class, 'subscriber', 'subscriber_type', 'subscriber_id');
    }
}

订单.php

class Order extends Model
{
    use HasFactory;

    /**
     * @return BelongsTo
     */
    public function client(): BelongsTo
    {
        return $this->belongsTo(Client::class);
    }           
}

创建订阅时,也会使用 plan_id 创建订单。

我可以获得给定客户端的所有订阅 $client->subscriptions()->get();

但问题是,除了订阅之外,我还需要为该计划/订阅为该用户创建第一个订单,我该怎么做?

php laravel eloquent eloquent-relationship
1个回答
0
投票

尝试这样,可能对你的问题没有什么帮助。

客户与订阅建立关系,订阅与计划建立关系,然后计划与订单建立关系。因此,当您创建订阅时,您必须同时存储订阅、计划和订单,或者如果您不想同时创建订单,您可以使用 plan_id 进行调用,客户端稍后会在该 plan_id 下下订单,但确保当客户订阅某些内容时您已经创建了计划。所以你可以这样调用第一个订单

$client = Client::with(['subscriptions' => function ($query) {
    $query->with(['plan.order' => function ($query) {
        $query->orderBy('created_at', 'asc')->first();
    }]);
}])->find($clientId);

或者您可以像这样定义单个订阅

 $client->subscription(function ($query) {
    $query->with(['plan.order' => function ($query) {
       $query->orderBy('created_at', 'asc')->first();
    }]);
 });
© www.soinside.com 2019 - 2024. All rights reserved.