У меня есть 3 стола корзина, аптека и cart_pharmacies
стол с тележкой
cart_id | user_id | total_price | status | created_at | updated_at
аптечный стол
pharmacy_id | name | address_id | created_at | updated_at
таблица cart_pharmacies
cart_pharmacies_id | cart_id | pharmacy_id | created_at | updated_at
В модальной корзине я определяю отношение
public function pharmacy()
{
return $this->belongsToMany('App\Pharmacy','cart_pharmacies','cart_id','pharmacy_id');
}
В модальности parmacy я определяю
public function cart()
{
return $this->belongsToMany('App\Cart','cart_pharmacies','pharmacy_id','cart_id');
}
В контроллере у меня есть pharmacy_id я пытаюсь обновить статус корзины с помощью кода
$pharmacy_id=$request->input('pharmacy_id');
$pharmacy= Pharmacy::findOrFail($pharmacy_id);
$pharmacy->cart()->update(['status'=>1]);
но это дает мне ошибку
SQLSTATE[23000]: Integrity constraint violation: 1052 Column
'updated_at' in field list is ambiguous (SQL: update `cart` inner join
`cart_pharmacies` on `cart`.`cart_id` = `cart_pharmacies`.`cart_id` set
`status` = 1,
`updated_at` = 2016-05-31 07:14:47 where `cart_pharmacies`.`pharmacy_id` = 5)
Ошибка SQL-запроса говорит о том, что существует несколько столбцов с именем updated_at (как основной, так и связанных таблиц) и не может решить, какие из них обновить. Это ошибка, и я думаю, что с eloquent невозможно решить проблему, так как updated_at будет добавлен в конце автоматически без указания имени таблицы.
Если вы используете модал, пожалуйста, обновите ваш модал этой строкой
public $timestamps = false;
попробуй, может быть полезно
Вы используете временные метки в вашей сводной таблице, которые могут автоматически контролироваться Eloquent с помощью метода withTimestamps ().
В вашем модальности приличия:
корзина публичных функций ()
{
return $this->belongsToMany('App\Cart','cart_pharmacies','pharmacy_id','cart_id')->withTimestamps();
}
Единственное решение, которое я нашел, это следующее:
Учитывая, что у вас есть массив значений для обновления ($values
) и ваш запрос ($query
), вы просто создаете базовый запрос и добавляете свои столбцы вручную:
$now = now();
// Manually add the timestamp columns
$values = $values + [
'table.' . Model::CREATED_AT => $now,
'table.' . Model::UPDATED_AT => $now,
];
$query->toBase()->update($values);
Model
это импорт Illuminate\Database\Eloquent\Model
, table
это имя таблицы, которую вы действительно хотите обновить.
Не самый лучший, но он работает, может быть, это станет особенностью в будущем …
Вот ссылка, чтобы преодолеть проблему
https://github.com/laravel/framework/issues/13909
Использование toBase()
перед обновлением помогите мне решить проблему
Удачного кодирования.