2016-12-07 3 views
1

ich diese globale Reichweite haben:Eloquent globale Reichweite mit Delete-Anfragen stören

class EarmarkScope implements Scope 
{ 
    public function apply(Builder $builder, Model $model) 
    { 
     $builder->leftJoin('users', 'users.id', '=', 'earmarks.by_id') 
      ->leftJoin('locations', 'locations.id', '=', 'earmarks.location_id') 
      ->select('earmarks.*', 'users.name AS by', 'locations.location') 
      ->orderBy('date', 'ASC'); 
    } 
} 

Aber wenn zu nennen versuchen: Earmark::destroy($id); ich diesen Fehler:

SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous (SQL: select earmarks .*, users . name as by , locations . location from earmarks left join users on users . id = earmarks . by_id left join locations on locations . id = earmarks . location_id where id in (72) order by date asc)

erkenne ich die globale Reichweite dieses verursacht , aber diese Reichweite spart mir so viel Zeit für SELECT-Abfragen. Wie kann ich vermeiden, dass es ein Problem mit destroy() und anderen nützlichen Laravel-Funktionen wie find() verursacht?

+0

was verwenden passieren, wenn Sie 'Earmark :: withoutGlobalScope (EarmarkScope :: class) -> destroy ($ id)' ? –

+0

Ich bekomme 'Call to undefined Methode Illuminate \ Database \ Query \ Builder :: destroy()' – daninthemix

+0

wenn es Ihnen nichts ausmacht, welche Laravel Version haben Sie benutzt? Wie auch immer, [lies einfach den Code] (https://github.com/laravel/framework/blob/5.3/src/Illuminate/Database/Eloquent/Model.php#L1065) Es hat keine Scopes zum Zerstören von Dingen angewendet. –

Antwort

0

Sie tun es hier ziemlich falsch.

A. Richten Sie Beziehungen auf Ihren Modellen ein. Es besteht hier keinerlei Notwendigkeit für einen globalen Anwendungsbereich.

B. Sie join s nicht auf dem globalen Bereich verwenden, aber whereIn

$builder->whereIn(
    'by_id', function ($q) { 
    $q->select('users.id') 
     ->from('users') 
     ->where('something useful...'); 

} 
);