我在 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();
但问题是,除了订阅之外,我还需要为该计划/订阅为该用户创建第一个订单,我该怎么做?
尝试这样,可能对你的问题没有什么帮助。
客户与订阅建立关系,订阅与计划建立关系,然后计划与订单建立关系。因此,当您创建订阅时,您必须同时存储订阅、计划和订单,或者如果您不想同时创建订单,您可以使用 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();
}]);
});