【问题标题】:checking between seance and payment检查降神会和付款
【发布时间】:2019-09-09 01:44:41
【问题描述】:

编辑:(08/09/2019)

我有一个关于付款验证的问题。

例如,学生Leonard 支付09/09/2019 的培训

在我的表格Training 中,我看到我可以添加几个降神会(培训)????

我可以阻止这个吗?

有关信息,在我的表 Training 中,我有 5 个外键 (fk_former, fk_student, fk_motorbike, fk_typetraining, fk_payment)

要加入表培训和付款我这样做:

模型培训

class Training extends Model
{
    //
    protected $fillable = ['date_seance', 'hour_start', 'hour_end', 'fk_motorbike', 'fk_former', 'fk_student'];
    protected $dates = ['date_seance'];

    public function motorbikes(){
        return $this->belongsTo('App\Motorbike', 'fk_motorbike');
    }

    public function formers(){
        return $this->belongsTo('App\Former', 'fk_former');
    }

    public function students(){
        return $this->belongsTo('App\Student', 'fk_student');
    }

    public function payments(){
      return $this->hasMany('App\Payment', 'fk_training');
  }


}

型号付款

class Payment extends Model
{

    protected  $fillable = ['date_payment', 'fk_student', 'method_payment',  'fk_type_seance', 'number_seance',  'total', 'fk_training']; 
    protected $dates = ['date_payment'];


    public function students(){

        return $this->belongsTo('App\Student', 'fk_student');
    }


    public function trainings(){
        return $this->belongsTo('App\Training', 'fk_training', 'id');
    } 

我的关系很好

我必须如何限制训练?因为现在是无限的……付款时不考虑降神会的次数。

这是我的控制器培训中的函数 store() 编辑

public function store(Request $request)
    {
        $request->validate([
                'date_seance' => 'required',
                'hour_start' => 'required',
                'hour_end' => 'required',
                'fk_motorbike' => 'required',
                'fk_former' => 'required',
                'fk_student' => 'required'


        ]);


    $date_start = $request->get('date_seance'); 
    $hour_start = $request->get('hour_start'); 
    $hour_end = $request->get('hour_end'); 
    $fk_motorbike = $request->get('fk_motorbike');
    $fk_former = $request->get('fk_former');
    $fk_student = $request->get('fk_student');



    $PaymentHasBeenMadeForThisTraining = Payment::where('fk_student', $fk_student) 
    ->where('fk_training', $request->get('fk_training')) 
    ->first(); 

    $trainings = Training::with('payments')->get();

    $johnsTrainings = Training::with(['payments' => function($query) use($fk_student){
    $query->where('fk_student', $fk_student);
    }])->get(); 


    /*
    if(isset($trainings)){
        return redirect()->route('trainings.index')
        ->with('error', 'Duplicate ! ');
    }*/


    if(isset($johnsTrainings)){
        return redirect()->route('trainings.index')
        ->with('error', 'Limit ! ');
    }

        else{
            Training::create($request->all());
                return redirect()->route('trainings.index')
                    ->with('success', 'Add');
        }

    }

在测试你的代码时,我得到了这个:

【问题讨论】:

  • 什么是seance
  • @levi: 你好,培训

标签: laravel laravel-5


【解决方案1】:

我认为有几件事需要注意。你说:

在我的培训表格中,我看到我可以添加几个降神会????

因此,我假设您希望根据某人是否为该培训付费来添加培训的能力。在您的表格上,您会看到有人可以添加更多培训,即使他们没有支付费用。这就是问题所在。

我建议您可能希望更改您的架构并简化您的关系。如果您将付款创建为 Payment 模型和 Training 模型之间的一对多关系,则不必担心检查付款是否可以应用到许多日期。

所以在你的 Training 模型上,关系很多:

public function payments(){
    return $this->hasMany("App\Payment", 'your_foreign_key', 'your_local_key');
}

在您的 Payment 模型上,它只有一个训练:

public function training(){
   return $this->belongsTo("App\Training");
} 

您将不得不调整这段代码,也许还需要调整一点数据库(可能不需要fk_type_seance,但确实需要某种fk_training)。但是现在很容易通过检查特定培训的付款来检查您是否与此人的培训付款有冲突。

$PaymentHasBeenMadeForThisTraining = Payment::where('fk_student', $fk_student)  
    ->where('fk_training', $request->get('fk_training')) 
    ->first();  

if-check 现在正在查看付款是否适合培训和学生 - 如果适合,它将停止同一个人对同一培训的双重付款。

对于您的培训列表,您需要从相反的角度进行。通过付款提取培训:

 $trainings = Training::with('payments')->get();

然后,在您的列表中,如果您要列出特定人员,您将需要检查该人员是否已付款,以便列出该人员为此特定培训支付的费用。您必须对此进行处理,但在您的控制器中会出现这样的情况:

 $thisStudentsTrainings = Training::with(['payments' => function($query) use($fk_student){
        $query->where('fk_student', $fk_student);
    }])->get();

编辑: 从这里,检查表格中的培训是否在该学生(来自表格)的付费培训集合中:

$hasPaidForThisTraining = $thisStudentsTrainings ->contains('id', $request->get('fk_training'));

您也可以通过提取 John 的付款然后链接到每个模型中的 Training 模型来取得成功 - 您也可以循环这些模型。可能会更容易。有几种方法可以做到这一点,但这离你的问题还有很长的路要走 - 寻找简化你的架构来完成这项工作:)

【讨论】:

  • 好的,一切都好。如果您试图限制与付款相关的培训次数,那么此答案对您有用。但是您需要在模型上正确设置 FK。您需要将fk_training 添加到Payment 表中。您需要从 Training 模型中删除 fk_paymentTraining 将从 Payment 模型上的外键中提取付款。这些关系不适用于您当前的数据库结构。 Payment 模型应该有 ONE 训练(因此 FK 在 Payment 模型上)。您将无法限制使用当前的 DB FK
  • 这里有很多变化。更改数据库需要做很多工作。我强烈建议先自行测试它,而不是尝试看看它是否适用于那种巨大的方法。所以 - 为 payments()training() 编写你的方法并首先测试这些以确保关系有效 - 这将告诉你你的方法和 FK 是否正确。然后,删除您的 store() 方法中的所有冲突检查,并仅测试以查看是否已为培训付款。让它工作,然后然后构建其他东西。现在,获得“重复”会使任务感到困惑:)
  • 删除$trainings = Training::with('payments')->get();。这每次都会给我们一个集合,并且几乎总是会被设置。正如我在回答中所说,其他两个查询是做类似事情的两种方式。根据您所追求的,使用其中一种。极限 !'消息告诉您,您已经基本解决了这个问题。该 if-check 告诉您表格中的学生已支付了一些培训费用。在该变量 ($johns) 中,您现在拥有他支付的所有培训的集合。现在检查表单中的 fk_training 是否在该集合中,如果是,则付费!
  • 这是一个不同的问题。但是很容易解决。 if( count($thisStudentsTrainings) >= 2) { limit }。第一个问题——如果不可能增加培训,他们是否已经为这个特定的培训付费了?如果是这样,代码工作正常。请记住,上面的查询会检查他们是否已支付了此特定培训的费用(来自表格)。这直接将其与培训联系在一起——您不希望他们为完全相同的培训支付两次费用,因此此查询将为您确定。如果他们试图为不同的培训付费,则不匹配,应该允许。
  • 不,我不这么认为。我认为这是一个完全不同的查询/问题/目标。我认为你已经在这样做了。因为 Payment 模型上的新 fk_training 将 THIS 付款与 THAT 培训相关联,所以上面的查询应该告诉您该特定培训是否已支付。我不知道 number_seance 的确切用途,但 fk_training 没有取代它并使其发挥作用吗?如果它正在计算付款次数 - 那是行不通的 - 上面的count() 将为 1 次培训做到这一点。 Payment::where('fk_student', $fk_student)->count()会给你总计
猜你喜欢
  • 2012-09-29
  • 2022-01-05
  • 2011-06-09
  • 2017-11-17
  • 2014-07-15
  • 2010-12-01
  • 2016-03-07
  • 2018-08-22
  • 2015-06-27
相关资源
最近更新 更多