Laravel принимает неправильное имя таблицы в модели, когда оно жестко закодировано

#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');  }  

и теперь это работает, потому что оно не связано! Не спрашивайте меня, почему, я просто потребитель этого фреймворка. Сумасшедшие вещи.