2016-03-29 9 views
0

im Versuch, Daten aus einer Viele-zu-viele-Beziehung in Laravel 5.2 abzufragen Aber wenn ich die Daten im immer leer Informationen abrufen möchten. Ich habe einige Zweifel, weil die Daten, die ich erhielt, nur quick_tags entdecken, aber dort sind keine Daten dort und es sollte quickTags sein.Kann nicht Elemente aus vielen zeigen zu viele Beziehung Laravel 5.2

ich diese

<?php 

namespace Knotion\Http\Controllers; 

use Illuminate\Http\Request; 
use Knotion\Http\Requests; 
use Knotion\Http\Requests\ResourcesRequest; 

use Knotion\CTL_Resource; 
use Knotion\CTL_Tag; 
use Knotion\CTL_QuickTag; 
use Knotion\CTL_RelatedTo; 
use Knotion\CTL_ResourceType; 


class ResourcesController extends Controller { 

    public function index(Request $request) { 

     $resources = CTL_Resource::paginate(10); 



     $resources->each(function($resources) { 
      $resources->tags; 
      $resources->quickTags; 
      $resources->relatedTo; 

     }); 

     return response()->json(
      $resources->toArray() 
    ); 
    } 

in meinem Controller tun, und ich habe diesen Code in meinem Modell

<?php 

namespace Knotion; 

use Illuminate\Database\Eloquent\Model; 

class CTL_Resource extends Model { 
    public $timestamps = false; 

    protected $table = "CTL_Resource"; 
    protected $primaryKey = "idResource"; 

    protected $hidden = [ 
     'coachVisibility', 'thumbnail', 'tags', 'relatedTo', 
     'studentVisibility', 'isHTML','studentIndex', 'coachIndex', 
     'isURL', 'source', 'path', 'status', 'updateTime', 'isfolder', 
     'parentResource', 'idModifierUser' 
    ]; 

    protected $fillable = ['idResourceType','productionKey', 'tags', 'idCreatorUser', 'idModifierUser', 'idCreationCountry', 'title', 'description', 'URL', 'fileName', 'extension', 'minimumAge', 'maximumAge', 'productionKey']; 

    public function creatorUser() { 
     return $this->belongsTo('Knotion\OPR_User', 'idCreatorUser'); 
    } 
    public function creationCountry() { 
     return $this->belongsTo('Knotion\CTL_Country', 'idCreationCountry'); 
    } 
    public function resourceType() { 
     return $this->belongsTo('Knotion\CTL_ResourceType', 'idResourceType'); 
    } 
    public function quickTags() { 
     return $this->belongsToMany('Knotion\CTL_QuickTag', 'CTL_Resource_has_QuickTags', 'idResource','idQuickTag'); 
    } 
    public function tags() { 
     return $this->belongsToMany('Knotion\CTL_Tag','CTL_Resource_has_Tags', 'idResource', 'idTag'); 
    } 
    public function relatedTo() { 
     return $this->belongsToMany('Knotion\CTL_RelatedTo', 'CTL_Resource_has_RelatedTo', 'idResource', 'idRelatedTo'); 
    } 

} 

Dies ist das Ergebnis. Wie Sie sehen dort quick_tags und seine leeren

{ 
    "total": 2, 
    "per_page": 10, 
    "current_page": 1, 
    "last_page": 1, 
    "next_page_url": null, 
    "prev_page_url": null, 
    "from": 1, 
    "to": 2, 
    "data": [ 
    { 
     "idResource": 0, 
     "idResourceType": "49ee39d6-eecd-11e5-b044-4914876a7f3d", 
     "idCreatorUser": "04664624-eecd-11e5-b044-4914876a7f3d", 
     "idCreationCountry": "b4afa9ae-eecc-11e5-b044-4914876a7f3d", 
     "productionKey": "1234567890", 
     "title": "ElTitle1", 
     "description": "ElDescription1", 
     "minimumAge": "5", 
     "maximumAge": "10", 
     "fileName": "ElFileName1", 
     "extension": ".png", 
     "URL": "ElURL1", 
     "createTime": "2016-03-28 14:07:21", 
     "quick_tags": [] 
    }, 
    { 
     "idResource": 0, 
     "idResourceType": "49ee39d6-eecd-11e5-b044-4914876a7f3d", 
     "idCreatorUser": "04664624-eecd-11e5-b044-4914876a7f3d", 
     "idCreationCountry": "b4afa9ae-eecc-11e5-b044-4914876a7f3d", 
     "productionKey": "0987654321", 
     "title": "ElTitle2", 
     "description": "ElDescription2", 
     "minimumAge": "5", 
     "maximumAge": "10", 
     "fileName": "ElFileName2", 
     "extension": ".png", 
     "URL": "ElURL2", 
     "createTime": "2016-03-28 14:44:37", 
     "quick_tags": [] 
    } 
    ] 
} 

Ich weiß nicht, ob seine notwendig ist, aber dies ist die SQL-Code der Beziehung. Ich Posting nur diese eine, aber andere sind sehr ähnlich

DROP TABLE IF EXISTS `CTL_Resource_has_QuickTags`; 
CREATE TABLE `CTL_Resource_has_QuickTags` (
    `idResource` varchar(40) NOT NULL COMMENT 'Foreign key to the CTL_Resource table ', 
    `idQuickTag` varchar(40) NOT NULL COMMENT 'foreign key to the CTL_QuickTags table.', 
    PRIMARY KEY (`idResource`,`idQuickTag`), 
    KEY `fk_CTL_Resource_has_QuickTag_QuickTag1_idx` (`idQuickTag`), 
    KEY `fk_CTL_Resource_has_QuickTag_CTL_Resource1_idx` (`idResource`), 
    CONSTRAINT `fk_CTL_Resource_has_QuickTag_CTL_Resource1_idx` FOREIGN KEY (`idResource`) REFERENCES `CTL_Resource` (`idResource`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
    CONSTRAINT `fk_CTL_Resource_has_QuickTag_QuickTag1_idx` FOREIGN KEY (`idQuickTag`) REFERENCES `CTL_QuickTags` (`idQuickTag`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='this table establishes the amount of quicktags that a given tag'; 
+0

Hat die 'CTL_Resource_has_QuickTags' Tabelle tatsächlich existieren? Ich kann nicht sehen, wie es erstellt worden wäre, da die Felder in dieser Tabelle 'varchar (40)' sind, aber die Felder, auf die verwiesen wird, scheinen 'int' zu sein. Wenn Sie versuchen, Fremdschlüssel für Felder mit unterschiedlichen Typen zu erstellen, wird MySQL fehlschlagen. – patricus

+0

Ja existieren tatsächlich diese Tabellen "CTL_Resource_has_QuickTags" und die anderen, aber ich mag nicht, wie die anderen die Datenbank entwarfen. Ich werde versuchen, mit Migrationen zu tun oder mich selbst zu entwickeln. Danke für den Tipp, auch ich vermute über die Datenbank. Ich hoffe, es funktioniert. Ich werde Ihnen Bescheid geben. Ich danke dir sehr. :) –

+0

Wie ist CTL_Resource.idResource definiert? Nach einem zweiten Blick auf Ihre Ausgabe scheint es, als könnte es ein varchar sein (da Ihre Ausgabe 0 zeigt, und ich bezweifle, dass Ihre Ausgabe 0 ist). Das würde auch erklären, wie die Tabelle existiert. – patricus

Antwort

0

Unter Berücksichtigung Ihrer idResource wird als 0 angezeigt wird, sowie einige ähnliche Felder aussehen wie GUIDs und Ihre Fremdschlüsselfelder sind definiert als varchar(40), ich gehe davon aus dass Ihr CTL_Resource.idResource Feld auch als varchar(40) definiert ist.

In diesem Fall, wenn das Feld $primaryKey keine automatisch inkrementierende Ganzzahl ist, müssen Sie dem Modell das mitteilen. Sie tun dies, indem Sie die $incrementing Eigenschaft auf der Modelleinstellung:

public $incrementing = false; 

Zusätzlich in Bezug auf Ihre quick_tags vs quickTags Frage, die mit der $snakeAttributes Eigenschaft auf Ihrem Modell zu tun hat. Wenn dieses Attribut auf "true" gesetzt ist (das ist die Standardeinstellung), gibt das Modell snake_case die Schlüssel Ihrer Beziehungsobjekte bei der Konvertierung in json (toJson()) oder ein Array (toArray()) aus. Wenn Sie diese ausschalten möchten, müssen Sie die $snakeAttributes Eigenschaft auf dem Modell setzen:

public static $snakeAttributes = false; 

Also, Ihr Modell sollte wie am Ende aussehen etwas:

class CTL_Resource extends Model { 

    // set the table name since it is not ctl_resources 
    protected $table = "CTL_Resource"; 

    // set the primary key field since it is not id 
    protected $primaryKey = "idResource"; 

    // primary key is not an auto-incrementing int 
    public $incrementing = false; 

    // no created_at, updated_at fields on this table 
    public $timestamps = false; 

    // don't snake case the relationship names on json/array conversion 
    public static $snakeAttributes = false; 

    // code ... 
} 
+1

OMG! Herr, du bist der Meister! Ich danke dir sehr! Sie haben mir sehr geholfen! Ich bin so dankbar mit dir. : D –