【问题标题】:Laravel global scope with if checkLaravel 全局范围和 if 检查
【发布时间】:2023-03-09 17:14:01
【问题描述】:

所以我尝试在我的模型上设置一个全局范围之类的东西,这样我就不必每次都去考虑一些参数。

问题是我目前有以下 Scopes 类;

<?php

namespace App\Scopes;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;

class NeedsPaymentScope implements Scope
{

    /**
     * Apply the scope to a given Eloquent query builder.
     *
     * @param Builder $builder
     * @param Model $model
     * @return void
     */
    public function apply(Builder $builder, Model $model)
    {
        if ($model->needs_payment) {
            $builder->where('is_paid', '=', true);
        }
    }
}

我将它包含在我的模型中,如下所示:

protected static function boot()
    {
        parent::boot();

        static::addGlobalScope(new NeedsPaymentScope());
    }

现在,由于在 Scope 类中,变量 $model 总是为空,我无法执行 if-check(需要完成!)我怎样才能将这个逻辑实现到每个 get() , find(); findOrFail(), ... 方法?

【问题讨论】:

    标签: php laravel eloquent scope


    【解决方案1】:

    您永远无法访问$model-&gt;needs_payment,因为模型尚未准备好,换句话说,您正在编写查询语句,您无法访问尚未完成查询的模型。

    【讨论】:

    • 好的,那么我该如何访问该值?或者我应该如何做到这一点?
    • 您要编写的完整查询是什么?
    • 所以我想实现这样的事情:检查sub_challenge 表中的获取行是否needs_payment 列为真,如果为真,则仅记录当 is_paid 值也为真时返回。
    • 所以我需要needs_payment false 和needs_payment true + is_paid true 的记录
    【解决方案2】:

    尝试查看作曲家以了解变量的全局范围。

    在 AppServiceProvider 的帮助下,您可以定义一个全局范围的变量。

    public function boot(){
    View::share('variable_name','your_variable_logic_code');
    }
    

    如果你有这么多行代码或逻辑,你也可以使用回调函数。

    现在您可以在任何地方访问变量而无需传入刀片。 no comapct no with(method) without return to a Blade,您可以在整个应用程序中访问。

    我认为它对你有帮助。

    【讨论】:

    • 除了将全局变量共享给几乎应该避免的每个视图的性能问题之外,您完全错过了 Robin 问题的重点。您不能在全局范围内使用变量的原因是因为还没有模型结果 - 所以如果您不能在查询中执行 if 语句(如 where),那么它需要在另一个范围内代码中的方式可能作为其他关系的本地范围。
    猜你喜欢
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    相关资源
    最近更新 更多