#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(); поэтому он возвращает только те счета, в которых есть клиент