#php #laravel #eloquent
Вопрос:
у меня есть модель:
lt;?php namespace AppModels; use IlluminateDatabaseEloquentFactoriesHasFactory; use IlluminateDatabaseEloquentModel; class MultiProductVariantPivot extends Model { //use HasFactory; protected $table = "multi_product_variant_pivot"; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'multi_product_id', 'variant_id', 'decision_tree', 'hashed_decision_tree' ]; }
У меня есть вопрос:
$variant_decision_trees = MultiProductVariantPivot::where('multi_product_id', $multi_product_id)-gt;get();
У меня ошибка:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'products.multi_product_variant_pivot' in 'where clause' (SQL: select * from `products` where `products`.`multi_product_variant_pivot` = 1 and `products`.`multi_product_variant_pivot` is not null)
Вопрос: Не мог бы кто-нибудь объяснить мне, почему Laravel указывает на таблицу «продукты» (у меня есть реальная таблица), а не на явно определенную? Как мне помешать Laravel безнаказанно отменять мои решения? Есть ли команда обновления терминала, которую я должен был выполнить, чтобы что-то обновить?
РЕДАКТИРОВАТЬ: Я обнаружил еще одну интересную вещь, если я изменю имя столбца в where()
«multi_product_id_test» вместо «multi_product_id», он будет ссылаться на правильную таблицу..
новая ошибка, данная:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'multi_product_id_test' in 'where clause' (SQL: select * from `multi_product_variant_pivot` where `multi_product_id_test` = 1)
Таким образом, выбор столбца в where()
влияет на выбор таблицы.. кто — нибудь хочет объяснить, как этого избежать? кроме того, похоже, что в первом запросе добавлено дополнительное предложение «не является нулевым», явно происходит что-то странное.
ПРАВКА 2: Если я изменю имя таблицы на что-то неправильное, например mproduct_variant
, если он использует правильный запрос, если я изменю его, чтобы он соответствовал существующей таблице, он выполнит неправильный запрос.. Ларавель изо всех сил старается сделать так, чтобы я не был продуктивным, я очень впечатлен.
ПРАВКА 3: если я изменю имя таблицы в своей модели на:
protected $table = "multi_product_variant";
ошибка, которую я получаю, такова:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'products.multi_product_variant_pivot' in 'where clause' (SQL: select * from `products` where `products`.`multi_product_variant_pivot` = 1 and `products`.`multi_product_variant_pivot` is not null)
как видно, он использует products
. multi_product_variant_pivot
вместо multi_product_variant
. может ли кто-нибудь объяснить такое поведение? похоже, это кэширование моего старого имени таблицы? очень странно.
Ответ №1:
Это потому, что вы называете свою модель суффиксом «Pivot», что противоречит системе отношений «многие ко многим» Laravel и не является лучшей практикой. Что вы можете сделать, так это «заставить» Laravel, указав ему, какую таблицу использовать:
$variant_decision_trees = MultiProductVariantPivot ::where(`multi_product_variant_pivot.multi_product_id`, $multi_product_id)-gt;get();
Это возможность, о которой я могу думать, возможно, это не корень. И ради любви к богу. Следуйте конвенции, если можете.
Комментарии:
1. я проверил, и, похоже, это не связано с суффиксом pivot, он выполняет правильный запрос ТОЛЬКО в том случае, если таблица не существует, если
multi_product_variant_pivot
она существует, она переключит таблицу на «продукты».. я даже попытался переименовать егоmproduct_variant
, и у него все та же проблема.
Ответ №2:
итак, вот оно, у меня была вызванная модель MultiProduct
с функцией для сопоставления вариантов продукта, например:
public function variants(){ return $this-gt;hasMany( 'AppModelsProduct', 'multi_product_variant_pivot'); }
итак, происходило то, что моя MultiProductVariant
модель переводилась в активацию variants()
функции из MultiProduct
модели. Я изменил его, чтобы он был:
public function products(){ return $this-gt;hasMany( 'AppModelsProduct', 'multi_product_variant'); }
и теперь это работает, потому что оно не связано! Не спрашивайте меня, почему, я просто потребитель этого фреймворка. Сумасшедшие вещи.