Некоторые записи (не все!) возвращают значение null из отношений Laravel eloquent

#php #laravel #eloquent #relationship

Вопрос:

Я в отчаянии. Речь идет об этих образцовых отношениях:

    public function customer()
    {
        return $this->hasOne('AppModelsInvoiceCustomer', 'invoice_id', 'id');
    }
 

Когда я выполняю запрос, я получаю три результата. Два с правильными отношениями в модели InvoiceCustomer, но один результат всегда является клиентом: null.

 Invoice::whereHas(['customer'])->get();
 

В invoice.id значение поля в точности соответствует invoice_customers.id в базе данных.

Это схема бд двух таблиц:

БД: клиенты по счетам

 Schema::create('invoice_customers', function (Blueprint $table) {
            $table->foreignUuid('invoice_id')->references('id')->on('invoices')->cascadeOnDelete();
            $table->string('number');
            $table->string('salutation');
            $table->string('first_name');
            $table->string('last_name');
            $table->string('street');
            $table->string('house_number');
            $table->string('postcode');
            $table->string('city');
            $table->string('email');
            $table->timestamps();
        });
 

БД: счета-фактуры:

 Schema::create('invoices', function (Blueprint $table) {
            $table->uuid('id')->primary();
            $table->foreignUuid('company_id')->references('id')->on('companies')->cascadeOnDelete();
            $table->string('number');
            $table->string('status');
            $table->timestamp('date');
            $table->decimal('total');
            $table->string('type');
            $table->json('additional_data')->default('{}');
            $table->timestamps();
        });
 

Я надеюсь, что у кого-то есть идея или, может быть, раньше была такая проблема.

Я благодарен за каждый ответ. Если вам понадобится что-нибудь еще, пожалуйста, дайте мне знать. Большое спасибо!

Ответ №1:

whereHas принял первый парам как string не array очень

 Invoice::whereHas('customer',function($query){

})->get();
 

Поскольку у вас нет никаких условий в отношениях, поэтому вы можете использовать has

 Invoice::whereHas('customer')->get();
 

или

 Invoice::has('customer')->get();
 

Лучшим вариантом в вашем случае является has()

Для Справки:

   /**
     * Add a relationship count / exists condition to the query with where clauses.
     *
     * @param  string  $relation
     * @param  Closure|null  $callback
     * @param  string  $operator
     * @param  int  $count
     * @return IlluminateDatabaseEloquentBuilder|static
     */
    public function whereHas($relation, Closure $callback = null, $operator = '>=', $count = 1)
    {
        return $this->has($relation, $operator, $count, 'and', $callback);
    }
 

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

1. Мне очень жаль! Спасибо вам за ваш ответ! Я попробовал кое-что и заменил его. Я изначально использовал with('customer') , но, к сожалению, это тоже не сработало.

2. @user16327873, тогда вам нужно использовать счет::с («клиент»)->имеет («клиент»)->>get(); поэтому он возвращает только те счета, в которых есть клиент