2016-03-29 4 views
0

im пытается запросить данные из отношений Many to Many в Laravel 5.2 Но когда я хочу получить данные, получающие пустую информацию. У меня есть некоторые сомнения, потому что данные, которые я получил, обнаруживают только quick_tags, но theres нет данных, и это должно быть quickTags.Невозможно отобразить элементы от многих до многих отношений. Laravel 5.2

Я делаю это в моем контроллере

<?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() 
    ); 
    } 

и у меня есть этот код в моей модели

<?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'); 
    } 

} 

Это результат. Как вы видите, есть quick_tags и его пустой

{ 
    "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": [] 
    } 
    ] 
} 

Я, если его нужно не знаю, но это SQL код отношений. Я просто разместить этот один, но другие очень похожи

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

действительно ли в 'CTL_Resource_has_QuickTags' таблицу существовать? Я не вижу, как это было бы создано, поскольку поля в этой таблице являются «varchar (40)», но ссылки, на которые делается ссылка, выглядят как 'int'. MySQL будет выходить из строя, если вы попытаетесь создать внешние ключи для полей с разнородными типами. – patricus

+0

Да действительно существуют эти таблицы «CTL_Resource_has_QuickTags» и другие, но мне не нравится, как другие создавали базу данных. Я постараюсь сделать с миграциями или разработать самостоятельно. Спасибо за подсказку, также я подозреваю о базе данных. Надеюсь это работает. Я дам вам знать. Огромное спасибо. :) –

+0

Как определяется CTL_Resource.idResource? После второго взгляда на ваш вывод кажется, что это может быть varchar (так как ваш вывод показывает 0, и я сомневаюсь, что ваш вывод равен 0). Это также объясняет, как существует таблица. – patricus

ответ

0

Учитывая ваш idResource отображает как 0, а также некоторые подобные поля выглядят GUIDs и ваши иностранные ключевые поля определяются как varchar(40), я буду считать, что ваше поле CTL_Resource.idResource также определено как varchar(40).

В этом случае, когда поле $primaryKey не является автоматически увеличивающимся целым числом, вам необходимо сообщить модели. Вы можете сделать это, установив $incrementing свойства на модели:

public $incrementing = false; 

Кроме того, по отношению к вашему quick_tags против quickTags вопрос, который имеет отношение к $snakeAttributes собственности на вашей модели. Если установлено значение true (по умолчанию), ваша модель будет snake_case ключами ваших объектов отношений при преобразовании в json (toJson()) или в массив (toArray()). Если вы хотите, чтобы отключить это, необходимо установить $snakeAttributes свойство на модели:

public static $snakeAttributes = false; 

Итак, ваша модель должна закончить тем, что что-то вроде:

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! Сэр, вы мастер! Спасибо огромное! Вы мне очень помогли! Я так благодарна вам. : D –