Laravel: Query Builder создает имя множественного числа: columns_id вместо column_id - PullRequest
0 голосов
/ 13 марта 2019

У меня есть свой класс "Product_reviews", который связан с классом "Products" следующим образом:

Products.php:

public function product_reviews()
{
    return $this->hasMany('App\Product_reviews');
}

Product_reviews.php:

public function products()
{
    return $this->belongsTo('App\Products');
}

Внешний ключ для таблицы «Product_reviews» - «product_id».

Итак, в контроллере я пытаюсь получить все данные:

$products = Products::with('product_reviews')->get();

И ... У меня есть ошибка, говорящая, что product_id не может быть найден:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'product_reviews.products_id' in 'where clause' (SQL: select * from `product_reviews` where `product_reviews`.`products_id` in (1, 2))

Исправьте меня, если я ошибаюсь, но я думаю, что построитель запросов добавляет'_id' к названию класса.Это можно исправить, перейдя к таблице «product_reviews» и изменив «product_id» на «products_id» ... Или, возможно, я мог бы передать имена всех классов и таблиц в единственное число.

Итак, мой вопрос:Какие еще варианты у меня есть, чтобы создатель запросов знал правильное имя столбца?

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Ваши модели должны быть названы в единственном числе, и тогда Laravel не будет пытаться использовать множественную форму имени столбца в сгенерированном SQL-запросе.

В вашем случае модель Products должнаназываться Product.Помните, что модель представляет одну запись в вашей базе данных, поэтому форма единственного числа верна.

Вы перезаписали это поведение, вручную установив внешнее поле в ваших отношениях $this->hasMany(..), которые обходили вокругпроблема, но не устранила основную причину.

Кроме того, вы должны избегать использования имен классов snake_cased, поскольку это нарушает PSR.Ваша Product_reviews модель должна называться ProductReview.

0 голосов
/ 13 марта 2019

Хорошо, я понял:

В Products.php:

return $this->hasMany('App\Product_reviews');

Я добавил еще 2 параметра в функцию hasMany, например:

return $this->hasMany('App\Product_reviews','product_id','id');

Эти параметры указывают имена идентификаторов.

Это сообщение действительно помогло:

laravel-hasmany-and-ownsto-parameters

Во всяком случае, я думаю, что в долгосрочной перспективе было бы неплохо делать то, что говорят Дэвид и Хктанг, и переименовывать мои классы с помощью названий в единственном числе.Спасибо за ваши ответы.

...