2014-02-20 2 views
4

Я пытаюсь удалить запись базы данных через связанную модель, используя ->delete(), но запись не удаляется.Невозможно удалить модель в Laravel с помощью Eloquent

Я попытался изменить форму с POST на DELETE, но это не имело никакого значения. И исследования вокруг SO тоже ничего не дали.

Предпочтительно, я хотел бы избежать использования Model::destroy($ids), , который действительно работает.

Методы маршрута:

// Delete an asset 
public function getDelete($id) 
{ 
    // Try to find the asset, throw exception if not found 
    $asset = Asset::findOrFail($id); 

    $this->layout->title = 'Delete an asset'; 
    $this->layout->content = View::make('asset.delete') 
      ->with('assetID', $id); 
} 

// Delete the actual asset 
public function postDelete() 
{ 
    $id = Input::get('AID'); 

    // Try to find the asset, throw exception if not found 
    $asset = Asset::findOrFail($id); 

    // Attempt to delete it 
    if($asset->delete()) 
    { 
     return Redirect::route('asset') 
       ->with('success', 'The asset has been deleted succesfully!'); 
    } 

    return Redirect::route('asset') 
      ->with('failure', 'The asset could not be deleted. Please try again.'); 
} 

Маршруты:

/* Route to deleting an asset 
* Shorthand: URL::route('deleteAsset') 
* Uses AssetController::getDelete 
*/ 
Route::get('/asset/delete/{id}', array(
    'as' => 'deleteAsset', 
    'uses' => '[email protected]' 
)); 

/* Route to actually deleting an asset 
* Shorthand: URL::route('deleteAssetPost') 
* Uses AssetController::postDelete 
*/ 
Route::delete('/asset/delete/', array(
    'as' => 'deleteAssetPost', 
    'uses' => '[email protected]' 
)); 

Модель:

class Asset extends Eloquent 
{ 
    public $timestamps = false; 

    protected $table = 'Asset'; 

    protected $primaryKey = 'AID'; 

    protected $fillable = array('ACID', 'AKID', 'AATID', 'APurchaseDate'); 

    // Retrieve the customer's name associated with the asset 
    public function customer() 
    { 
     return $this->hasOne('Customer', 'CID', 'ACID'); 
    } 

    // Retrieve the asset type that is associated with the asset 
    public function assetType() 
    { 
     return $this->hasOne('AssetType', 'ATID', 'AATID'); 
    } 

    // Get the customer name 
    public function getCustomerName() 
    { 
     return $this->customer()->first()->CName; 
    } 

    // Get the asset type name 
    public function getAssetTypeName() 
    { 
     return $this->assetType()->first()->ATName; 
    } 

    // Get the associated key 
    public function getKey() 
    { 
     return $this->AKID === -1 ? 'nvt' : $this->AKID; 
    } 

    // Get the purchase date in readable form 
    public function getPurchaseDate($format = 'd-m-Y') 
    { 
     return date($format, strtotime($this->APurchaseDate)); 
    } 
} 

В соответствии с контроллером удаление успешна и дает сообщение об успешном ,

Ошибок не возникает.

[править]

Кто-нибудь знает, что я здесь отсутствует, чтобы сделать эту работу?

После регистрации запросов, следующие запросы выполняются с помощью $asset->delete():

select * from `Asset` where `AID` = ? limit 1 
delete from `Asset` where `AID` = ? 

Я попробовал то же самое с Asset::destroy($id), результаты от являются:

select * from `Asset` where `AID` = ? limit 1 
select * from `Asset` where `AID` in (?) 
delete from `Asset` where `AID` = ? 
+0

Это сложный вопрос - все выглядит правильно для меня. Когда вы говорите, что это не удается, что вы имеете в виду? Вы сказали, что метод '-> delete()' возвращает true, поэтому, предположительно, он терпит неудачу (т. Е. Строка не удаляется). Ваша модель не использует мягкие удаления, но вы должны убедиться, что это не так. Также может потребоваться выполнить регистрацию ваших SQL-запросов, чтобы вы могли видеть: 1) если какой-либо SQL выполняется и 2) если да, то что он пытается сделать. – alexrussell

+1

@alexrussell Это точно, как вы это описываете. В нем говорится, что он удалил строку, но на самом деле это не так. Моя модель действительно не использует мягкие удаления, и я еще не изучил их. Я попробую выполнить регистрацию запроса и вернуться к вам. – MisterBla

+0

@alexrussell Я редактировал свой вопрос с помощью зарегистрированных запросов. – MisterBla

ответ

4

После недолгого обсуждения в чат, мы поняли, что код определял метод getKey() для модели, который использовался для конкретной цели. Однако на самом деле это метод, который Eloquent определяет для всех моделей, и он использует его довольно сильно. В этом случае метод Eloquent delete вызывал getKey(), чтобы определить идентификатор модели.

Причиной ошибки является то, что хотя само удаление не удалялось (поскольку оно пыталось удалить модель с идентификатором «nvt»), технически ничего не стоило ошибочно, поскольку она был совершенно верным кодом/SQl: DELETE FROM `table` WHERE `id` = 'nvt';

+1

Я переименовал метод в 'getAssetKey()' и теперь Отлично работает. Спасибо за помощь! Для желающих [здесь чат] (http://chat.stackoverflow.com/rooms/47952/discussion-between-alexrussell-and-richard-a) – MisterBla

+0

Большое спасибо! Я вытягивал свои волосы из-за этого! –

+0

Хе-хе, рад, что вы нашли ответ полезным. – alexrussell

Смежные вопросы