I need to be able to access all the data in one of the columns of my table. My initial approach was to do something like this. The column i am trying to access in my database is called 'Tags'
//get all posts
$post = Post::get();
//get all post tags
$post_tags = $post['tags'];
but this returns null. I know there will be an extremely simple way to do it, i am just not seeing it!
EDIT
The reason i am doing this is i have a tagging system in place when something is posted you can add 3 tags which relate to that post. What i am trying to do in the long run is when a tag is clicked it will filter out all the posts with that set tag.
The way this works is when a tag is clicked the user will be redirect to a url like so
//test-site.com/posts/tags/{tag}
so ill be using that tag to then query the database for the results. I have managed to confuse myself in a task i thought would be farily simple!
If your tags are stored in the same table, the problem may be that you are getting a full result set:
Post::get();
When you should get only one row:
Post::first();
So this one might do the trick in this case:
$post = Post::first();
$post_tags = $post->tags;
If you use Post::get() or Post::all(), you'll have to iterate trough the result set to get your info:
foreach(Post::all() as $post)
{
echo $post->tags;
}
Related
First post on stackoverflow. I have been following this site for a long time, and usually find what im looking for. But this has me perplexed.
Let me set the stage. I am developing a web driven program. I have Wordpress, with the Divi theme from Elegant Themes. and I am using shortcodes to insert into the modules. I am a newbie (this says it all.)
Here is my problem. I have run a wpdb query that returns a single row of results.
$editresult = $wpdb->get_results ("SELECT `serialnumber`, `batttype`, `cells`, `fullvolts` FROM listbattery WHERE serialnumber = '$serialnumber'", ARRAY_A);
When I vardump this, i get the following.
array(1) {[0]=>array(4) {["serialnumber"]=>string(10)"battery #2" ["batttype"]=>string(5) "NiCad" ["cells"]=>string(1) "8"["fullvolts"]=>string(6)"12.125"}}
So with that being said, I know that the query is working fine. I know that I am receiving the information. What I can't for the life of me figure out, is how to turn the results from each column into individual variables, so that I can insert each variable randomly throughout my page.
I have tried about 8 different methods so far. I hope you guys can help! thanks!!!
You can loop through the result:
foreach($editresult as $result) {
$serialnumber = $result['serialnumber'];
$batttype = $result['batttype'];
$cells = $result['cells'];
$fullvolts = $result['fullvolts'];
}
If only one row is expected to be returned, you can do the following
$editresult = $wpdb->get_row("SELECT `serialnumber`, `batttype`, `cells`, `fullvolts` FROM listbattery WHERE serialnumber = '$serialnumber'", ARRAY_A);
Then you can access returned values like
$editresult['serialnumber']
$editresult['batttype']
$editresult['cells']
$editresult['fullvolts']
or if you change ARRAY_A to OBJECT, you will be able to access these values like so
$editresult->serialnumber
$editresult->batttype
$editresult->cells
$editresult->fullvolts
There is no need in get_results and foreach like shown in #nanodanger's answer if you always expect to get only 1 row
I'm using Laravel 4.1.x and I have a Has Many and Belongs To Many relationship between Tags and Photos (A photo belongs to many tags, a tag belongs to many photos). I'm using a pivot table with tag_id and photo_id
I know how to paginate the tags, using:
Tag::paginate($limit);
I'm able to fetch one tag with all the related photos using:
Tag::find($id);
But what I want to do now, is to retrieve all the photos that belongs to a tag , but paginating them. So, its something like the second code that I show, but with a page and limit parameter.
For example, I would want to see the first 15 photos that belongs to the tag with id=1, and be able to after that select the second 15.
Update:
Based on the answer provided, I tried with ->photos()->paginate(), but using this, it doesn't returns the rest of the informaton from the tag (Name, description, etc).
I've been able to get everything using:
$tag = Tag::findOrFail($id)->toArray();
$tag['photos'] = Tag::findOrFail($id)->photos()->paginate($limit)->toArray();
But I'm not sure if there is any other way to do this, and if this is generating an extra query.
Have you tried...
Tag::find(1)->photos()->paginate(15);
If you need to display information on the tag, there are a few ways. Eager loading is usually best but in this case because we know the tag id, we aren't being faced with the n+1 problem so it may look a bit more confusing than it needs to be.
$limit = 15;
$tag = Tag::with(array('photos' => function($q) use ($limit)
{
$q->paginate($limit);
}))->find(1);
// Use
echo $tag->name;
foreach($tag->photos as $photo) {
echo $photo->description;
}
Or you can just do what we did earlier except split it up a bit to save the individual parts.
$tag = Tag::find(1);
$photos = $tag->photos()->paginate(15);
// use
echo $tag->name;
foreach($photos as $photo) {
echo $photo->description;
}
I am editing a template to try and add some conditional logic to my page.
The page template shows topics related to a user.
I want to add a piece of code which will grab the user name from the page we are viewing and then use that in a string for my conditional statements.
The code I have put together is as follows, but it breaks my page so I am doing something wrong.
<?php global
// I query the ID and try and set that to the $userID - I think I am doing this wrong, but when I echo the ID it gets the correct info.
$userID = get_queried_object()->ID;
// This is the string I create using the userID which should be from the query above
$memberstatus = get_user_meta($userID,'member_status',true);
?>
later on I use IF statements to use thsi result (which i know work) so i won't post them. My problem is trying to get the above to work.
Any help?
damm, looks like when I remove 'global' from the php it works! I thought global had to be in this...ah well
I have small problem.
I've coded a full website in php using CodeIgniter framework. One of my modules is search module, it contains text input with keyword and three select lists with filtering criterias.
That's ok, when I'm searching something - result's listing pagination is done via URL like that:
mysite.com/$keyword/$criteria1/$criteria2/$criteria3/$offset
works like a charm.
But when I'm entering into one of my images (it's image gallery) I want to have an option to go into NEXT and PREVIOUS image from my search results - the ones which I entered this image from.
I'm solving this case now in this way - I have session table called 'search_conditions' and I'm storing values of keyword and my three criterias there, but that's quite not comfortable, because why if someone opens second window and search something else there?
Then all of his searches in another windows or tabs are getting the same criteria - because with every new search, user overwrite the session value.
My next and previous functions:
public function next($count)
{
$search = $this->session->userdata('search_conditions'); //getting session table and overwriting it
$catid = isset($search['catid'])?$search['catid']:'0';
$brandid = isset($search['brandid'])?$search['brandid']:'0';
$prodid = isset($search['prodid'])?$search['prodid']:'0';
$keyword = isset($search['keyword'])?$search['keyword']:'';
$res = $this->search_model->main_search($keyword, $catid, $brandid, $prodid, $count, 1);
}
public function previous($count)
{
$search = $this->session->userdata('search_conditions');
$catid = isset($search['catid'])?$search['catid']:'0';
$brandid = isset($search['brandid'])?$search['brandid']:'0';
$prodid = isset($search['prodid'])?$search['prodid']:'0';
$keyword = isset($search['keyword'])?$search['keyword']:'';
$res = $this->search_model->main_search($keyword, $catid, $brandid, $prodid, $count-2, 1);
}
Can you recommend me some other, more comfortable solution, because this seems not to be good...
: )
Thank you!
Add an index to the $search_conditions variable:
$search_conditions[1]['catid']
$search_conditions[1]['brandid']
...
then refer to it with a controller's or config variable. This way you can allow one session to store multiple search conditions.
But I would recommend you drop storing the search condition in session. Instead, just pass it with the URI. Session data, in the case you describe, work as an intermediary; you don't need it. Use the Pagination Class and pass the search page number, not the direction (next or previous) to the URI.
Do not worry that the URI may look ugly - it only depends on what user searches for, and it's still friendly to share. Your only concern is if the GET string does not extend the limited length.
Pull the segments from the URI in your next() and previous() functions. Use the codeigniter URL helper. That should allow you to pass the different search criterion as variables to the next page, this would also remove your need to use the session.
OK, here's my dilemma:
I've read all over about how many guys want to be able to display a set of images from Flickr using PHPFlickr, but lament on how the API for PhotoSets does not put individual photo descriptions. Some have tried to set up their PHP so it will pull the description on each photo as the script assembles the gallery on the page. However, the method has shown how slow and inefficient it can be.
I caught an idea elsewhere of creating a string of comma separated values with the photo ID and the description. I'd store it on the MySQL database and then call upon it when I have my script assemble the gallery on the page. I'd use explode to create an array of the photo ID and its description, then call on that to fill in the gaps...thus less API calls and a faster page.
So in the back-end admin, I have a form where I set up the information for the gallery, and I hand a Set ID. The script would then go through and make this string of separated values ("|~|" as a separation). Here's what I came up with:
include("phpFlickr.php");
$f = new phpFlickr("< api >");
$descArray = "";
// This will create an Array of Photo ID from the Set ID.
// $setFeed is the set ID brought in from the form.
$photos = $f->photosets_getPhotos($setFeed);
foreach ($photos['photoset']['photo'] as $photo) {
$returnDesc = array();
$photoID = $photo['id'];
$rsp = $f->photos_getInfo($photoID);
foreach ($rsp as $pic) {
$returnDesc[] = htmlspecialchars($pic['description'], ENT_QUOTES);
}
$descArray .= $photoID."|~|".$returnDesc[0]."|~|";
}
The string $descArray would then be placed in the MySQL string that puts it into the database with other information brought in from the form.
My first question is was I correct in using a second foreach loop to get those descriptions? I tried following other examples all over the net that didn't use that, but they never worked. When I brought on the second foreach, then it worked. Should I have done something else?
I noticed the data returned would be two entries. One being the description, and the other just an "o"...hence the array $returnDesc so I could just get the one string I wanted and not the other.
Second question is if I made this too complicated or not. I like to try to learn to write cleaner/leaner code, and was looking for opinions.
Suggestions on improvement are welcome. Thank you in advance.
I'm not 100% sure as I've just browsed the source for phpFlickr, and looked the the Flickr API for the getInfo() call. But let me have a go anyway :)
First off, it looks like you shouldn't need that loop, like you mention. What does the output of print_r($rsp); look like? It could be that $rsp is an array with 1 element, in which case you could ditch the inner loop and replace it with something like $pic = $rsp[0]; $desc = $pic['description'];
Also, I'd create a new "description" column in your database table (that has the photo id as the primary key), and store the description in their on its own. Parsing db fields like that is a bit of a nightmare. Lastly, you might want to force htmlspecialchars to work in UTF8 mode, cause I don't think it does by default. From memory, the third parameter is the content encoding.
edit: doesn't phpFlickr have its own caching system? Why not use that and make the cache size massive? Seems like you might be re-inventing the wheel here... maybe all you need to do is increase the cache size, and make a getDescription function:
function getDescription ($id)
{
$rsp = $phpFlickr->photos_getInfo ($id);
$pic = $rsp[0];
return $pic['description'];
}