Jump to content
php.lv forumi

Eloquent ->with() ar ->select()


qwerty

Recommended Posts

Cerams ir kāds Eloquent zinātājs. Tātad, ja ir kāds vienums datubāzē (piemēram, raksts Article) kas ir daļa no on-to-many relationshipa, tad varam lietot ->with() metodi, piemēram:

Articles
::select('article_id', 'article_text')  //Seit ir probleema
->with([
    'user' => function($q){
        $q->select('user_id', 'user_name'); // Sis straadaa kaa paredzeets, no usera nak tikai id, name
    }
])
->get();

Problēma ir tāda, ka ->select() priekš user strādā kā paredzēts, bet ārējais select, ar ko es gribu ierobežot, kādus datus ievākt no article, rada problēmu - atgrieztajiem objektiem ir noņemts nost 'user', jo tas it kā nav ārējā select sarakstā. Bet, ja es pievienoju tur to 'user', tad izmet erroru, ka datubāzē nav kolonna 'user' - Eloquent nesaprot, ka es ar to domāju nevis kolonnu, bet with() relationshipu.

 

Vai kāds zina, kā varu norādīt interesējošās kolonnas gan Article, gan User ?

Link to comment
Share on other sites

Man liekas, ka ar šo biju saskāries, bet neatceros, kā atrisināju :)

 

Varbūt šeit ir atbilde: http://stackoverflow.com/questions/19852927/get-specific-columns-using-with-function-in-laravel-eloquent

 

Noteikti, ka var atrast kko šeit: https://www.google.lv/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=eloquent+specify+column+with

Link to comment
Share on other sites

To stackoverflowa jautājumu jau izskatīju, tur nekas par to nav. Lielāko daļu googles linkus arī.

Tos iegūtos rezultātus ir paredzēts sūtīt uz klienta pusi kā daļu no JSON atbildes.

Tāpēc vienīgais, ko varu iedomāties - Article modelī definēt $visible laukus priekš pārvēršanas uz JSON. Tad to, ko man atgriež Eloquent, pārvērst uz JSON un vēlreiz atpakaļ uz PHP objektu. (Man neder uzreiz iegūtais JSON, jo tas nav viss JSON, kas jāsūta..)

Link to comment
Share on other sites

Nu ja ļoti sāpīgi izdomāt, Tu vienmēr vari atlasīt ierakstus, izķeksēt ārā masīvu ar ID, un atlasīt atsevišķi ar  vienu selectu whereIn('id', $ids);

Man pat parasti patīk tā darīt, jo tad viss ir skaidri saprotams, nenotiek nekāda maģija ar ORMa join'iem utt.

Link to comment
Share on other sites

Article tabulā Tev glabājas tādi lauki "article_text" "article_id" vai "id" & "text" ?

Aizvāc ārējo selektu.

->get(['id', 'text']);

Tāvā gadījumā neredzu baigo sāpi mest pāri un nelietot select.

Tavā vietā es pat neizmantot eager lodingu, uz 1TM (jautājums vai tiešām tur ir jābūt 1TM, ja reiz article pieder lietotājam ( ar domu, article autors ) tas būtu 1T1)

Pietiks ar to, ka Tev būs relācija uz user un atlasīsi articles. Tālāk kontekstā varēsi izsaukt kaut ko šādu

foreach ($articles as $article) {
    echo $article->user->name;
}

Ar ko arī pilnībā pietiek. Ja aplikācijas būvē uz FW, es šaubos, ka šis būtu tas stāsts kurā vajadzētu plēst un sarežģīt galvu, lai atlasītu konkrētos rowus. Performanci var iegūt arī citādākā, vai arī šis ir moments kurā jau vajag tāda veida optimizāciju?

 

Note: Vai tiešām modelis Tev saucas "Articles" , modeļu nosaukumus vēlams saukt singular, jo tas atbild par "vienu" konkrētu ierakstu tabulā.

Edited by Kemito
Link to comment
Share on other sites

Es tikko izmēģināju tādu kvēriju - patiesībā tas ārējais selects strādā tieši tā, kā tu vēlies.

Tava problēma, ka jūzeris ir izņemts no gala rezultātiem, rodas tad, ja tu ārējā selektā neesi selectojis user_id jeb to lauku, kas atbilst par relāciju. Ja tā lauka nav, tad eloquent uzskata, ka šis Article nevienam User nepieder.

Articles
::select('article_id', 'article_text', 'user_id')  //Tagad te vairs problema nav
->with([
    'user' => function($q){
        $q->select('user_id', 'user_name');
    }
])
->get();
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...