Первый вопрос:
Почему 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
соответственно?
Первый вопрос
Свободно владеет построителем запросов, а 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);
});
Здесь есть что взять. Это потребует значительных изменений в планировании и создании приложения.
Других решений пока нет …