Запрос Laravel с несколькими, где не возвращается ожидаемый результат

#php #laravel

#php #laravel

Вопрос:

Я пытаюсь создать запрос из репозитория в модели с 2 предложениями where.

Это данные, которые у меня есть в таблице MySQL:

 id      name            environment_hash
1       online_debit    abc
2       credit_cart     abc
 

Я хочу запросить по имени и environment_hash . Для этого я создал метод findByHashAndMethod() (см. Ниже).

Но когда я использую его в своем контроллере, например:

 $online_debit = $this->ecommercePaymentMethodRepository->findByHashAndMethod($hash, 'online_debit')->first();
 

или это:

 $credit_card = $this->ecommercePaymentMethodRepository->findByHashAndMethod($hash, 'credit_cart')->first();
 

Я продолжаю получать обе строки, а не только отфильтрованные. Что не так с кодом?

Это мой PaymentMethodRepository.php

 class EcommercePaymentMethodRepository extends BaseRepository
{


    public function findByHashAndMethod($hash = null, $payment_method)
    {
        $model = $this->model;

        if($hash) 
        {
            $filters = ['environment_hash' => $hash, 'name' => $payment_method];
            $this->model->where($filters);
        }

        else
        {
            $this->model->where('environment_hash',  Auth::user()->environment_hash)
                        ->where('name', $payment_method);
        }


        return $model;
    }

    public function model()
    {
        return EcommercePaymentMethod::class;
    }
}
 

И это моя модель EcommercePaymentMethod.php

 <?php

namespace AppModels;
use Eloquent as Model;
use IlluminateDatabaseEloquentSoftDeletes;

class EcommercePaymentMethod extends Model
{
    use SoftDeletes;

    public $table = "ecommerce_payment_methods";

    protected $dates = ['deleted_at'];

    public $fillable = [
        "name",
        "payment_processor_id",
        "active",
        "environment_hash"
    ];

    protected $casts = [
        "name" => "string"
    ];

    public function payment_processor()
    {
        return $this->hasOne('AppModelsEcommercePaymentProcessor');
    }
}
 

Комментарии:

1. попробуйте add -> get() при возврате

2. Вы смешиваете $this->model с $model в своем методе.

Ответ №1:

Хотя я не совсем уверен, зачем ->first() когда-либо возвращать более одного результата, в вашем методе репозитория было несколько вопиющих проблем, которые могут привести к ошибкам.

 class EcommercePaymentMethodRepository extends BaseRepository
{

    // 1. Do not put optional parameter BEFORE non-optional
    public function findByHashAndMethod($payment_method, $hash = null)
    {
        // 2. Call ->model() method
        $model = new $this->model();

        // 3. Logic cleanup
        if (is_null($hash)) {
            $hash = Auth::user()->environment_hash;
        }

        return $model->where('environment_hash', $hash)
            ->where('name', $payment_method);
    }

    public function model()
    {
        return EcommercePaymentMethod::class;
    }
}