È comodo che il modello laravel fornisca un metodo che possa restituire risultati da un'altra tabella associata.Perché il modello laravel duplica un insieme di dati e come (se possibile) avere solo un set di dati?
Ad esempio, ho una tabella chiamata elemento e un'altra tabella chiamata feedback, in cui la tabella di feedback memorizza il feedback di un articolo nella tabella degli articoli. Quindi, per ottenere il tutto valutazioni di elemento con ID 1, farò:
Item::find(1)->feedback;
E la seguendo questo la stampa dell'oggetto restituito.
Illuminate\Database\Eloquent\Collection Object
( [items:protected] => Array
(
[0] => Feedback Object
(
[table:protected] => feedback
[connection:protected] =>
[primaryKey:protected] => id
[perPage:protected] => 15
[incrementing] => 1
[timestamps] => 1
[attributes:protected] => Array
(
[id] => 1
[rma_id] => 3
[item_id] => 8
[quo_id] => 0
[case_id] => i2eM20160120
[line_no] => 000001
[content] => test
[status] => sent
[read] => 0
[sender] => Tester
[created_at] => 2016-01-20 18:03:44
[updated_at] => 2016-01-20 18:03:44
)
[original:protected] => Array
(
[id] => 1
[rma_id] => 3
[item_id] => 8
[quo_id] => 0
[case_id] => i2eM20160120
[line_no] => 000001
[content] => test
[status] => sent
[read] => 0
[sender] => Tester
[created_at] => 2016-01-20 18:03:44
[updated_at] => 2016-01-20 18:03:44
)
[relations:protected] => Array
(
)
[hidden:protected] => Array
(
)
[visible:protected] => Array
(
)
[appends:protected] => Array
(
)
[fillable:protected] => Array
(
)
[guarded:protected] => Array
(
[0] => *
)
[dates:protected] => Array
(
)
[touches:protected] => Array
(
)
[observables:protected] => Array
(
)
[with:protected] => Array
(
)
[morphClass:protected] =>
[exists] => 1
)
)
)
Funziona bene, e si vede che c'è un solo feedback su elemento con id 1.
Ciò che mi preoccupa è che il set di dati è duplicato in [attributes:protected]
e [original:protected]
. Questo è solo un caso di test e il caso reale consisterà in migliaia di feedback e avere un dataset duplicato è un enorme spreco di memoria. Il set di dati non viene duplicato se sto usando l'approccio DB::table('table_name')
, ma è molto meno conveniente.
Perché laravel ha bisogno di duplicare i dati nel modello?
E c'è un modo per restituire solo un set di dati?
Attualmente sto usando ->toArray()
per ridurre i dati non necessari subito dopo la query, ma l'utilizzo della memoria è ancora lì perché laravel sta ancora creando quel set di dati.
Tecnicamente non c'è bisogno di utilizzare Eloquente come ORM con laravel si tratta solo di ciò che è costruito in Se non ti piace il modo in cui Eloquente genera oggetti poi. usa un ORM che ti piace o scrivi il tuo codice e poi disabilita Eloquent. – Pitchinnate
Qualche suggerimento per ORM? @ Pitchinnate – cytsunny
Non sicuro, dovresti vedere tutte le diverse strutture che vengono restituite da ORM differenti per trovarne una che ti piace e che non spreca memoria. Il più grande ORM basato su PHP che io conosca è Doctrine. – Pitchinnate