Accessing Users of a group - laravel

I make the following query
$group = Group::with('user.campaign')->where('groupName', 'TeamA')->get();
This returns something like the following
Collection {#429 ▼
#items: array:1 [▼
0 => Group {#398 ▼
#table: "user_groups"
#guarded: []
#attributes: array:5 [▶]
#original: array:5 [▶]
#relations: array:1 [▼
"User" => Collection {#402 ▼
#items: array:5 [▼
0 => User {#409 ▶}
1 => User {#410 ▶}
2 => User {#411 ▶}
3 => User {#412 ▶}
4 => User {#413 ▶}
]
}
]
#hidden: []
#visible: []
#appends: []
#fillable: []
}
]
}
So I can see User is within the relations. However, I am having issues accessing the users which are apart of the Group TeamA.
If I try
$group->user
I get an error. Unfortunately, my error page at the moment only seems to say something went wrong, without any details.
How would I go about accessing the users of this group?
Thanks

i think you have some mistake on that , User field is a collection ...
that mean , User field is not instance of User class and is collection of users
"User" => Collection {#402 ▼
#items: array:5 [▼
0 => User {#409 ▶}
1 => User {#410 ▶}
2 => User {#411 ▶}
3 => User {#412 ▶}
4 => User {#413 ▶}
]
}
i suggest you to rename User field in Team class to Users.
after that it's good to know, property name should be camel case ...

Related

Laravel, get relation data

I'm kinda new to relations in Laravel.
When I do ddof an object, I get this:
Collection {#485 ▼
#items: array:1 [▼
0 => Menu {#484 ▼
#table: "menus"
#fillable: array:6 []
#hidden: array:2 [▶]
#connection: null
#primaryKey: "id"
#perPage: 15
+incrementing: true
+timestamps: true
#attributes: array:9 []
#original: array:11 []
#relations: array:2 [▼
"pivot" => Pivot {#486 ▶}
"subMenus" => Collection {#items: array:3 [▼
0 => SubMenu {#488 ▼
#table: "sub_menus"
#fillable: array:5 []
#hidden: array:2 []
#connection: null
#primaryKey: "id"
#perPage: 15
+incrementing: true
+timestamps: true
#attributes: array:8 []
#original: array:10 [▼
"id" => 16
"name" => "My name" <--------- this is what I need to get
"created_at" => "2018-11-20 15:19:14"
"updated_at" => "2018-11-20 20:29:34"
How can I get the namevalue from the Model SubMenu that has a relation with my dd(model) ?
In Menu I got thos relation:
public function subMenus()
{
return $this->belongsToMany('App\SubMenu', 'menu_submenu', 'menu_id', 'submenu_id')->where('estado', Define::ESTADO_ACTIVO)->orderBy('orden');
}
I tried something like:
dd($MyMenuObject->subMenus());
but not working. Tried with get(), ->submenu, etc.
EDIT: This is my data:
with dd($perfil_activo->menus); I get:
You can access it via
$model->subMenus()->first()->name;
But since $subMenus() is a many-to-many relationship, you should probably do this via a loop:
foreach($model->subMenus AS $subMenu){
$subMenu->name; // Do with as you please.
}
Edit: Since $model is also a Collection, you need to use ->first() or a loop:
$model->first()->subMenus->first()->name;
// OR
foreach($model AS $model){
$model->subMenus->first()->name;
// OR
foreach($model->subMenus AS $subMenu){
$subMenu->name;
}
}
This is all dependant on how you fetch $model; if your Query ends with a ->get() or ->all(), it will be a Collection. If it ends with ->first(), ->find(), etc, it will be a single Model.
You can list all the subMenu names on an array: or object
$names=$model->subMenus()->pluck('name'); //object
//or
$names=$model->subMenus()->pluck('name')->toArray();// to array
dd($names);

How can I sort and separate this Laravel Collection

How can I sort this Collection by the values? It is needed also to add another index before each item because this way it is not possible since two items will have the same index, in our case: "User1".
I need this Collection:
Collection {#254 ▼
#items: array:2 [▼
"User1" => Collection {#253 ▼
#items: array:1 [▼
3 => 12.0
]
}
"User2" => Collection {#255 ▼
#items: array:2 [▼
3 => 11.0
1 => 13.0
]
}
]
}
to be sorted by the last values, and be separated in other "items":
Collection {#254 ▼
#items: array:3 [▼
"User2" => Collection {#255 ▼
#items: array:2 [▼
1 => 13.0
]
}
"User1" => Collection {#253 ▼
#items: array:1 [▼
3 => 12.0
]
}
"User2" => Collection {#255 ▼
#items: array:2 [▼
3 => 11.0
]
}
]
}
I can convert it in an array and make an iteration, but maybe Laravel has a simpler way.
Just use the sortBy() method. And specify wich value you want to sort
Here you can find all information you need about the collection methods:
https://laravel.com/docs/5.7/collections#method-sort

How can i change key id in method class orm Laravel?

Maybe is not possible but i have in table answers for radio input with id of question and answer like id = 36 , answer = Yes. My code below get all answers
public function getAnswer() {
return $this->hasMany('App\Answer', 'user_id', 'id')
->with('question')
->whereHas('question.group', function($query) {
$query->where('name', 'simple_quesion');
});
}
and i have collection which is ok
#items: array:9 [▼
0 => getAnswer {#400 ▶}
1 => getAnswer {#401 ▶}
2 => getAnswer {#402 ▶}
but is any way to get keys and assign with this collection like
#items: array:9 [▼
35 => getAnswer {#400 ▶}
37 => getAnswer {#401 ▶}
42 => getAnswer {#402 ▶}
in this method public function getAnswer() ?
[UPDATE]
full collection
Collection {#396 ▼
#items: array:9 [▼
0 => getAnswer {#400 ▼
#fillable: array:3 [▶]
#connection: "mysql"
#table: null
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:7 [▼
"id" => 18
"user_id" => 11
"answer_id" => 34
"answer" => "YES"
]
#original: array:7 [▶]
#changes: []
And i need key answer_id => 34
#items: array:9 [▼
34 => getAnswer {#400 ▼
Ok i am so stupid. This is so easy. In blade or controller i can use:
{{ dd($user->getAnswer->pluck('answer', 'answer_id')) }}
Try this:
In Answer model, add this:
public function question(){
return $this->belongsTo("App\Question"); //the column name of the question should be "question_id"
}
in Question model, do:
public function answers(){
return $this->hasMany("App\Answer");
}
And in your controller, where you want to get the question and its answers, you just do:
Question::with('answers')->all(); //assuming you want to get all the questions and their answers

Excel file to Html using Maatwebsite/Laravel-Excel

I just setting up Maatwebsite/Laravel-Excel plugin from here https://github.com/Maatwebsite/Laravel-Excel/. I want to read excel file and display data in Html table in a blade In laravel. I got datas by using following:
$content=Excel::load($file, function($reader) {
})->get();
when I echo $content; I have following ::
SheetCollection {#762 ▼
#title: ""
#items: array:3 [▼
0 => RowCollection {#623 ▼
#title: "Sheet1"
#items: array:4 [▼
0 => CellCollection {#693 ▼
#title: null
#items: array:2 [▼
"name" => "Abc"
"city" => "City1"
]
}
1 => CellCollection {#692 ▼
#title: null
#items: array:2 [▼
"name" => "Xyz"
"city" => "city2"
]
}
2 => CellCollection {#710 ▼
#title: null
#items: array:2 [▼
"name" => "Name2"
"city" => "city3"
]
}
3 => CellCollection {#709 ▼
#title: null
#items: array:2 [▼
"name" => "Name2"
"city" => "city3"
]
}
]
}
1 => RowCollection {#728 ▼
#title: "Sheet2"
#items: []
}
2 => RowCollection {#697 ▼
#title: "Sheet3"
#items: []
}
]
}
Those are data on my xlsx file . Now I want to render it on view blade . any Idea???? thanks
You can use the Laravel Collections methods to get data. Explore the methods but I think you can try something like this.
return $content->all();
or iterate each row and store them formated in your data to render it in a blade view using each.
$content->each(function($row){
// process here each row
});
I hope it can help you.

Laravel 5 Array to View

Can some please tell me how to display the results of this array in a view in Laravel 5?
RowCollection {#464 ▼
#title: "Worksheet"
#items: array:3 [▼
0 => CellCollection {#472 ▼
#title: null
#items: array:2 [▼
"name" => "Owen Kelley"
"age" => 29.0
]
}
1 => CellCollection {#473 ▼
#title: null
#items: array:2 [▼
"name" => "Jim Jackson"
"age" => 50.0
]
}
2 => CellCollection {#474 ▼
#title: null
#items: array:2 [▼
"name" => "Sally Anne"
"age" => 35.0
]
}
]
}
I have been struggling with this for ages!
Many thanks.
You should use foreach, example:
In controller/routes.php:
return view('yourviewname')->with('elephants', 'elephants')
In blade view:
#foreach($elephants as $elephant)
{{ $elephant->name }}
#endforeach

Resources