Laravel Fluent против Eloquent

Первый вопрос:

Почему Fluent вернуть array:

return DB::connection('mysql')->table('cards')
->where('setCode', '=', $setcode)
->get();

В то время как Eloquent возвращает object:

return Card::where('setCode', '=', $setcode)
->get();

Насколько я могу судить, сами данные выглядят точно так же.

Второй вопрос:

Следующий код находится в Fluent:

DB::table('auth.users_deck_overview as deckOverviewDB')
->leftJoin('auth.users_deck_cards as deckCardsDB', 'deckOverviewDB.deck_uid', '=', 'deckCardsDB.deck_uid')
->leftJoin('mtg_cards.cards as cardsDB', 'deckCardsDB.card_uid', '=', 'cardsDB.uid')
->select('cardsDB.name', 'deckCardsDB.card_quantity', 'cardsDB.manaCost', 'cardsDB.colors', 'cardsDB.cmc')
->where('deckOverviewDB.username', '=', $user->username)
->where('deckOverviewDB.deck_uid', '=', $deckUid)
->where('deckCardsDB.board', '=', 0)
->where('cardsDB.cmc', '!=', '')
->get();

Как бы я изменил выше, чтобы Eloquent предполагая users_deck_overview, users_deck_cards, cards Модели DeckOverview, DeckCard, а также Card соответственно?

3

Решение

Первый вопрос
Свободно владеет построителем запросов, а Eloquent — ORM. Eloquent построен на свободном владении.

Второй вопрос
Короткий ответ: ты не будешь. ORM действительно не подходит для таких вещей. Это ситуация с квадратным колышком / круглым отверстием.

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

Упрощенное представление о структуре ORM может выглядеть следующим образом.

DeckOverview
hasMany DeckCard

DeckCard
belongsToMany Card
belongsTo DeckOverview

Card
belongsToMany DeckCard

Лучший способ извлечь все эти данные — это энергичная загрузка.

$deckOverview = DeckOverview::with('deckCards.cards')->first();

Вот где ORM действительно не соответствует вашему подходу. ORM построен, чтобы иметь объект, который представляет запись в таблице. Здесь у нас есть DeckOverview, который имеет несколько карт DeckCards. Они будут доступны так.

$deckCard = $deckOverview->deckCards->first();

Или, может быть, это …

foreach ($deckOverview->deckCards as $deckCard)
{
foreach ($deckCard->cards as $card)
{
// do something with each card in the deck
}
}

Вы можете ограничить результаты, полученные через нетерпеливую загрузку. Это будет загружать только карты DeckCards, где плата была 0.

$deckOverviews = DeckOverview::with(array('deckCards' => function ($query)
{
// Equals comparison operator can be assumed
$query->where('board', 0);
})->get()

Вы можете использовать должен применять ограничения на основе отношений. Это будет загружать только DeckOverviews, у которых были DeckCards, где плата была 0.

$deckOverviews = DeckOverview::has(array('deckCards' => function ($query)
{
$query->where('board', 0);
});

Здесь есть что взять. Это потребует значительных изменений в планировании и создании приложения.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]